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

问题描述:

可能重复:
Is it better to autorelease or release right after?另一个iOS的内存管理澄清自动释放/发布使用

(向前通知:请不要在ARC方面讨论这个话题)

我们公司内部有一场辩论,主题是autorelease/early-release的用法。让我解释一下。

方案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周期不会放太多强调内存占用。

所以我的问题是你更喜欢哪一个,或者是否有Apple推荐的方法?

再一次:请让我们忽略ARC的时刻:) ...

感谢。

+1

我们是否也可以忽视这两个例子都是毫无意义的,因为它们创建了一个不可变的空数组? ;) – jrturton

+1

一吨的问题 - http://stackoverflow.com/search?q=release+vs+autorelease – beryllium

它不是经常使用这个不可变的对象,但对于NSMutableArray它是一个不同的东西。

NSMutableArray *myList = [[NSMutablearray alloc] init]; 
Someobject *myObject = [[Someobject alloc] init]; 
[myList addObject:myObject]; 
[myObject release]; 
[self setList:myList]; 
[myList release]; 

我经常像上面那样使用它。在iPhone/iPad上,当您的内存量有限时,我认为尽快清理未使用的内存是个很好的习惯。当没有其他选项可用时,我只使用autorelease。

基本上,这只是一个内存管理问题:-)和性能。

如果你正在分配一个简单的对象,autorelease应该没问题。我猜想1 K的记忆不应该是你的应用程序的批评。

但是......如果你分配一个占用大量内存的对象,或者分配许多需要一些内存的对象,例如在一个循环中,你会被建议尽快释放它们。如果没有,您可能会遇到性能问题,并且在最好的情况下,应用程序的didReceiveMemoryWarning方法(及其后果)将更频繁地调用。

一切都取决于你想要什么样的优化:优化应用程序...或者如果你是运行循环内进行很多次,然后提前释放优化开发:-)

最好防止建立一个大的自动释放池。否则,它没有任何区别,并归结于个人偏好。

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

至于内存使用情况相同。唯一的区别是Autorelease池的大小。当你将它们分配给一个属性时,当你的release它不会被释放,因为内存区别的差异将是在autorelease池中存储一个条目。自动释放池中有一些开销,但在这种情况下通常可以忽略不计。你应该做一些自然而然的事情,并且让代码易于阅读/维护。