我的代码中有一个方法运行了很多次。 我需要我的代码能够运行几个小时,所以这个方法将被执行数百次。
该方法由临时变量组成,这些变量并不大。 关于 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/