我的代码中有一个运行很多次的方法。 我需要我的代码能够运行几个小时,所以这个方法将被执行数百次。
该方法由临时变量组成,这些变量并不大。 我想知道在ARC下的内存管理和性能方面,以下4种方法中最好的方法是什么:
1)Alloc-init所有临时对象
2)改为使用“方便”初始化器(即[NSDictionary dictionaryWithObjectsAndKeys:...])。
3)将这些临时对象声明为ivars / properties / global,在Class + init方法中初始化它们,并在这个多次运行的方法中设置它们(不进行初始化)。
4)使用@autorelease块限定整个方法。
请解释每个项目对ARC项目下的性能和内存管理的影响。
非常感谢!
答案 0 :(得分: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;
}
}
答案 1 :(得分:1)
关于不同方法的执行时间,我创建了一个示例iOS项目,用于衡量4种不同方法的平均执行时间。
您可以按downloading the code from github对其进行测试,并替换MethodsToTest.m
类的内容。
从我所做的测试来看,使用便捷方法比alloc-init方式具有稍好的性能(0.004毫秒更好)。