0

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

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

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

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

非常感谢你!

4

2 回答 2

1

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

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

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

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

为了代码的清洁,我要么在它们将被使用的范围内(即在循环内)声明变量,要么可能只是在循环外并重新分配值。在重新分配变量之前将其归零是一种很好的做法。

编辑

根据您的评论,这是我认为的最佳实践

- (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;
    }
}
于 2012-11-21T10:13:32.447 回答
1

关于不同方法的执行时间,我创建了一个示例 iOS 项目,用于测量 4 种不同方法的平均执行时间。

您可以通过从 github 下载代码并替换MethodsToTest.m该类的内容来对其进行测试。

从我所做的测试来看,使用便捷方法的性能比 alloc-init 方法稍好一些(好 0.004 毫秒)。

于 2012-11-22T09:09:51.590 回答