这不是使用或不使用autorelease的问题,因为在某些情况下,autorelease是唯一的方式,你会通过。问题应该是“为什么不在所有对象上使用autorelease,而不是使用保留和释放?”。
要回答这个问题,你应该先了解一下autorelease的正确用法。假设您有一个具有两个属性的类:firstName和lastName。每个都有一个getter和一个setter。但你也需要,将返回全名,由这两个字符串连接成一个全新的字符串的方法:
- (NSString *) fullName {
NSString str = [[NSString alloc]initWithFormat:@"%@ %@", firstName, lastName];
// this is not good until we put [str autorelease];
return str;
}
什么是错的画面?返回字符串的引用计数为1,所以如果你不想泄漏,调用者应该在他完成时释放它。从来电者的角度来看,他只是要求物业价值fullName
。他没有意识到他得到了一个全新的对象,他应该在使用后释放它,而不是对该类内部持有的NSString的引用!
如果我们在返回之前放置[str release]
,字符串将被销毁,并且该方法将返回垃圾!这是我们使用[str autorelease]
的地方,以便稍后标记对象以便发布(通常在事件处理完成时)。这样调用者可以获得他的对象,并且不必担心他是否应该释放它。
约定是在方法将其返回给调用方之前,在新对象上调用autorelease。例外情况是名称以alloc
,new
或copy
开头的方法。在这种情况下,呼叫者知道为他们创建了一个全新的对象,他们有义务调用该对象的释放。
完全用autorelease替换release是一个坏主意,因为对象会很快堆积并堵塞内存,特别是在循环中。 iPhone上的资源是有限的,所以为了最大限度地减少内存占用,完成它之后立即释放对象是您的职责。
高兴地帮助(给我一些东西来搜索:-) – TofuBeer 2009-03-05 05:58:00
他们没有提到的是很多基金会的调用autorelease对他们管理的对象,因此在紧密的循环中,你需要创建和管理你的类如果您正在处理适量的数据,则拥有自己的自动释放池。 – rpetrich 2009-03-05 07:06:43