另一个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的时刻:) ...
感谢。
它不是经常使用这个不可变的对象,但对于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池中存储一个条目。自动释放池中有一些开销,但在这种情况下通常可以忽略不计。你应该做一些自然而然的事情,并且让代码易于阅读/维护。
我们是否也可以忽视这两个例子都是毫无意义的,因为它们创建了一个不可变的空数组? ;) – jrturton
一吨的问题 - http://stackoverflow.com/search?q=release+vs+autorelease – beryllium