Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 关于临时对象的iOS内存/性能优化_Iphone_Ios_Performance_Ios5_Memory Management - Fatal编程技术网

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

Iphone 关于临时对象的iOS内存/性能优化,iphone,ios,performance,ios5,memory-management,Iphone,Ios,Performance,Ios5,Memory Management,我的代码中有一个方法可以运行很多次。 我需要我的代码能够运行数小时,所以这个方法将执行数百次 该方法由临时变量组成,这些变量并不大。 关于ARC下的内存管理和性能,我想知道以下4种方法中哪一种是最好的: 1) Alloc初始化所有临时对象。 2) 改用“便利”初始值设定项(即,[NSDictionary Dictionary WithObjectsAndKeys:…])。 3) 将这些临时对象声明为ivar/properties/global,在Class+init方法中初始化它们一次,然后在这

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

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

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

请解释在ARC项目下,每一项对性能和内存管理的影响


多谢各位

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

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

if (newVal != iVarVal) {
    [iVarVal release];
    iVarVal = [newVal retain];
} 
无论哪种方式,你的物体都不应该停留在它们需要的时间之外,这是弧的点。如果您想确定,请设置一个测试项目,并使用“分配”工具在工具中对其进行配置,然后查看内存使用是否持续增长,或者是否趋于平稳,以及在什么时候趋于平稳

为了保持代码的整洁,我要么在将要使用的范围内(即在循环内)声明变量,要么就在循环外重新赋值。最好在重新分配变量之前将其置零

编辑

进一步对您的评论,这是我认为最好的实践

- (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;
    }
}
-(void)示例方法{
id变量=nil;
对于(int i=0;i
关于不同方法的执行时间,我创建了一个示例iOS项目,用于测量4种不同方法的平均执行时间

您可以通过测试它,并替换
MethodsToTest.m
类的内容


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

你不能两次释放一个会使应用程序崩溃的对象……好吧,但它如何回答我的问题呢?:)我不会使用任何类型的自动释放,因为这听起来像是额外的开销。如果您想要最大的性能,ARC似乎是一个错误的决定。只需手动释放不需要的对象,您就会没事了。@Anatoly:您确定要优化真正重要的东西吗?你关心你的应用程序的速度,还是它的功耗?你真的会跑几个小时吗?(如果用户不使用手机或平板电脑,应用程序将进入后台并基本停止。)@Codo:My app是苹果允许的后台应用程序之一。它有一个后台模式键,应该可以运行几个小时。谢谢,你能再澄清一下这四个选项中的最佳实践是什么吗?对我来说,最佳实践是在循环外声明变量。使用方便的方法设置值,然后在循环结束时将变量置零。我已经编辑了演示的答案,这意味着将有循环限制变量对象,直到自动释放池耗尽,或者变量将在每次迭代结束时释放?不,自动释放并没有真正进入它。ARC将在编译代码之前分析代码,并在必要时添加retain/release语句。假设
variable=nil
自动替换为
[variable release],variable=nil所以不应该有对象的构建。每个对象都应该在循环结束时被释放,在下一次迭代开始时创建一个新的对象。实际上,我似乎不明白ARC将哪些对象放入自动释放池。我认为所有使用便利初始值设定项初始化的对象都被分配到自动释放池。我认为这就是使用alloc/init分配对象和方便的初始化器之间的区别非常感谢。。那么@autorelease block和使用iVars呢?您必须自己测试它-只需在
MethodsToTest.m中实现使用iVars和
@autorelease
的方法即可