我是Obj-C的新手,我有一个关于自动释放的问题。可以为几种方法返回自动释放的变量吗?例如:
- (void) methodC {
Object anObj = [self methodB];
//Do something with anObj
}
- (Object *) methodB {
return [self methodA];
}
- (Object *) methodA {
Object anObj = [[anObj alloc] init];
release [anObj autorelease];
}
即使它返回方法链并在顶部使用,变量是否仍然有效?或者它是否必须保留在某个地方?
谢谢
答案 0 :(得分:2)
是的,在这种情况下它会有效。如果有人耗尽自动释放池,您只需担心变量被释放。只要您编写了沿途返回的所有函数并且没有明确地消耗自动释放池,您就不必担心在您之下释放对象。
在绝大多数情况下,NSRunLoop
中的代码负责耗尽自动释放池。当您将应用程序代码中的控制权返回给API代码时(例如通过从touchesBegan
处理程序返回等),您不知道自动释放池是否会耗尽,因此您必须假设最坏的情况它会的情况。在这种情况下,您必须retain
要保留引用的任何对象。
例如:
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
Object *anObj = [self methodC]; // Your methodC as before -- anObj is valid
[pool drain]; // anObj will be deallocated here
答案 1 :(得分:0)
变量应保持有效。如果对象实际上由某个其他对象“拥有”并且可以间接/无意地与其一起释放,则只需要保留该对象。例如,如果从数组中提取对象然后释放了数组,则除非明确保留对象引用,否则对象引用可能会变为无效。
有关详细信息,请参阅Object Ownership and Dismissal,尤其是有关共享对象的自动释放和有效性的部分。后者使用以下代码来说明如何“意外”使对象引用无效。
heisenObject = [array objectAtIndex:n];
[array removeObjectAtIndex:n];
// heisenObject could now be invalid.
以下代码显示了如何使用retain
缓解此问题。
heisenObject = [[array objectAtIndex:n] retain];
[array removeObjectAtIndex:n];
// use heisenObject.
[heisenObject release];