类方法实例范围?

时间:2009-11-16 10:52:10

标签: objective-c cocoa

我的问题是关于在+ planet中创建的对象的范围。我被告知“自动释放的对象将在它们创建的方法/函数的持续时间内保持不变”在我的示例中,我假设行星实例的范围在main()之内不在我执行初始alloc / init的方法中?

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

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

    Planet *outerMost;

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

EDIT_001

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

    Planet *outerMost;

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

加里

3 个答案:

答案 0 :(得分:5)

自动释放的对象始终有效,直到周围的NSAutoreleasePool被耗尽。在您的示例中,这涵盖了主要方法。

通常,自动释放的对象在运行循环结束时释放。因此,如果您调用一个返回自动释放对象的方法,它在您的函数体中仍然有效,直到您手动排空周围的NSAutoreleasePool或从运行循环中调用的方法返回。

答案 1 :(得分:4)

自动释放的对象将保持不变,直到当前运行循环结束(此时AutoRelease池将被耗尽)或直到自动释放池被手动耗尽。

它与创建它们的位置无关 - 只是在创建池时它们处于活动状态以及该池何时耗尽。

编辑:

如果不将它们放入上下文中,则很难理解自动释放池的用途。在过程应用程序中使用自动释放池而不是事件驱动的应用程序并不总是有意义的。如果你有一个无限循环的应用程序,那么你会不时地耗尽池。以下是它可能会更有意义:

begin application

begin endless loop
    create autorelease pool

    // process messages from the event queue (mouseclicks, keypresses etc) and
    // do stuff here - this might create autoreleased object

    drain autorelease pool
end of endless loop

end application

自动释放池在每次迭代时都会耗尽。重要的是要注意,如果在单个循环迭代中有大量处理,则池可能会变得非常完整。在这种情况下,您可以手动排空池。

答案 2 :(得分:2)

关于“自动释放的对象将在它们创建的方法/函数的持续时间内保持不变”的说明过于简单化,并假设您正在以“可可方式”执行操作。将“真实代码”放在main()中并不是Cocoa方式,所以你会遇到更真实的答案,其他人已经完美地给你了。当您的自动释放池被刷新时,事情就会消失。

这个音符的实际含义是,当你在一个函数中创建对象时,你可以确定对象可以至少保持,直到你的函数结束, as只要你不自己刷新自动释放池。这意味着如果您只在该函数中使用该对象,则无需在该函数中保留和释放它。如果你手动刷新自动释放池,你应该知道什么时候消失的实际规则(再次,frenetisch applaudierend在这里是正确的),并且大部分都忽略了简化。