关于自动释放/释放使用的另一个iOS内存管理澄清

时间:2011-11-16 10:33:55

标签: iphone objective-c ios iphone-sdk-3.0

  

可能重复:
  Is it better to autorelease or release right after?

(预告:请不要以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 :) ...

感谢。

4 个答案:

答案 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)

如果您在运行循环中多次执行该操作,则最好提前释放以防止建立大型自动释放池。否则,它没有任何区别,取决于个人喜好。

我个人在早期发布阵营,如果只是为了避免太多嵌套的方括号。