(预告:请不要以ARC的形式讨论这个话题)
我们公司内部存在争议,主题是自动释放/早期释放的使用。让我解释一下。
情景1:
NSArray *tempArray = [[NSArray alloc] init];
self.myRetainingProperty = tempArray;
[tempArray release];
情景2:
self.myRetainingProperty = [NSArray array]; // or [[[NSArray alloc] init] autorelease];
基本上两种情况都是完全可以的,但我很好奇社区使用这些情景的方法是什么?我更希望“尽快发布”(场景1) - 特别是在内存可能很珍贵的iOS上,但另一方面,一个自动释放的对象(场景2)一直存在到下一个runloop周期不会太多对内存占用的压力。
所以我的问题是你更喜欢哪一个,或者苹果推荐的方法是什么?
再一次:拜托,让我们暂时忽视ARC :) ...
感谢。
答案 0 :(得分:1)
就内存使用情况而言,相同。唯一的区别是Autorelease池的大小。当您将它们分配给属性时,当您release
时,对象将不会被释放,因此内存差异的差异将是在自动释放池中存储条目。自动释放池有一点开销,但在这些类型的情况下,它通常可以忽略不计。你应该做一些自然的事情,以及使代码易于阅读/维护的原因。
答案 1 :(得分:0)
它不常用于不可变对象,但是对于NSMutableArray来说它是另一回事。
NSMutableArray *myList = [[NSMutablearray alloc] init];
Someobject *myObject = [[Someobject alloc] init];
[myList addObject:myObject];
[myObject release];
[self setList:myList];
[myList release];
我经常使用它如上所述。在iPhone / iPad上,当你的内存有限时,我认为它是一个很好的习惯,可以尽快清理未使用的内存。当没有其他可用选项时,我只使用autorelease。
答案 2 :(得分:-1)
基本上,这只是内存管理的问题:-)和性能。
如果你要分配一个简单的对象,自动释放应该没问题。我想记忆的1 Ko不应该对你的应用程序起批评。
但是......如果你分配一个占用大量内存的对象,或者在一个循环中分配许多占用一些内存的对象,你会被建议尽快释放它们。如果没有,您可能会遇到性能问题,并且在最佳情况下会更频繁地调用您应用的didReceiveMemoryWarning
方法(及其后果)。
一切都取决于您想要的优化类型:优化应用程序......或优化开发人员: - )
答案 3 :(得分:-1)
如果您在运行循环中多次执行该操作,则最好提前释放以防止建立大型自动释放池。否则,它没有任何区别,取决于个人喜好。
我个人在早期发布阵营,如果只是为了避免太多嵌套的方括号。