Obj-c自动释放一系列方法的变量

时间:2011-05-04 05:14:46

标签: objective-c autorelease

我是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];  
}

即使它返回方法链并在顶部使用,变量是否仍然有效?或者它是否必须保留在某个地方?

谢谢

2 个答案:

答案 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];