对象实例内存管理

时间:2009-11-16 08:55:06

标签: objective-c cocoa

这是另一个问题的后续问题,我的问题是关于在main()中使用retain / release。根据我在这个简单示例中的理解,不需要retain / release语句。但在更复杂的情况下,添加它们的最佳做法是确保行星实例不会意外释放。

+(Planet *) planet {
    gPlanetCount++;
    //return [[[Planet alloc] init] autorelease];
    return [[[self alloc] init] autorelease];     // Better
}

int main(int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    Planet *outerMost;

    outerMost = [[Planet planet] retain];
    ...
    ... some code
    ...
    [outerMost release]; 
    [pool drain];
    return 0;
}

EDIT_001

所以我最好把上面写成。

int main(int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    Planet *outerMost;

    outerMost = [Planet planet];
    ...
    ... some code
    ...
    [pool drain];
    return 0;
}
欢呼加里

1 个答案:

答案 0 :(得分:3)

MarkusMüller的评论是正确的,即你的代码是正确的,除了缺少的池分配和初始化。

但是,如果在例程/方法中创建一个自动释放的对象,并且在该例程/方法中使用该对象,并且在完成该例程/方法之前已经完成,那么就没有理由保留它然后释放它。保证该对象在例程/方法的生命周期内保留,并且在这种情况下,它很可能通过[池排水]方法释放。

您不会出现意外释放outerMost的情况。预期的释放在[池排水]。在main()中调用多少其他方法无关紧要,只要您选择保留/释放指南,就不需要保留outerMost。