iphone - 关于临时对象的 iOS 内存/性能优化

标签 iphone ios performance ios5 memory-management

我的代码中有一个方法运行了很多次。 我需要我的代码能够运行几个小时,所以这个方法将被执行数百次。

该方法由临时变量组成,这些变量并不大。 关于 ARC 下的内存管理和性能,我想知道以下 4 种方法中哪一种是最好的:

1) Alloc-init 所有的临时对象。
2) 改为使用“便利”初始化器(即 [NSDictionary dictionaryWithObjectsAndKeys:...])。
3) 将这些临时对象声明为ivars/properties/global,在Class +init 方法中初始化它们一次,然后在这个运行多次的方法中设置它们(不初始化)。
4) 用@autorelease block 限定整个方法的范围。

请解释它们中的每一个对ARC项目下的性能和内存管理的影响。

非常感谢!

最佳答案

如果您要在每个循环结束时将对象设为 nil 然后重新初始化它们,理论上 ARC 应该在此时释放对象。

重新分配给 iVar,应该有效地插入经典的 setter 模式。

if (newVal != iVarVal) {
    [iVarVal release];
    iVarVal = [newVal retain];
} 

无论哪种方式,您的对象都不应停留超过它们需要的时间,这就是 ARC 的要点。如果您想确定,请设置一个测试项目并使用分配工具在仪器中对其进行分析,看看内存使用量是持续增长还是趋于平稳,以及在什么时候趋于平稳。

为了代码的整洁,我会在它们将被使用的范围内(即在循环内)声明变量,或者可能只是在循环外并重新分配值。在重新分配变量之前将变量设为 nil 是一种很好的做法。

编辑

根据您的评论,这是我认为的最佳做法

- (void)exampleMethod {
    id variable = nil;
    for (int i = 0; i < LOOP_LIMIT; i++) {

        // init 
        variable = <alloc/init variable here>

        /* use variable somehow.... */

        // nil variable before reassigning 
        variable = nil;
    }
}

关于iphone - 关于临时对象的 iOS 内存/性能优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13489804/

相关文章:

ios - 实例成员无法使用

c - select() 系统调用很耗CPU

c - C 中最快的 fgets 实现

Java large 性能

html - 单击 html 按钮打开 ios 相机

iphone - 如何检测 GPS 坐标是否落在 MKMapView 上的某个区域?

ios - 在 iOS swift3 中并行处理视频录制和通话功能

c# - 有时是,有时不是JSON错误:“没有为'System.String'类型定义无参数构造函数”

ios - 静态 TableView 单元格 : Clear color not corresponding

ios - Swift:在闭包中捕获函数参数是否会强烈保留它?