类方法实例范围?

问题描述:

我的问题是关于+ 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; 
} 

加里

自动释放对象始终有效,直到周围的NSAutoreleasePool被排空。在你的例子中,这涵盖了主要方法。

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

自动释放物体将保持周围,直到当前运行的循环(在该时间自动释放池将被排出)的端部,或直至自动释放池是手动排空。

它与创建它们的位置无关 - 只是当创建池时以及该池被耗尽时,哪些池处于活动状态。

编辑:

自动释放池的目的是很难理解,如果你不把它们放到上下文。在程序性应用程序中使用自动释放池而不是事件驱动的应用程序并不总是有意义的。如果你有一个无限循环的应用程序,那么你会想要不时地耗尽游泳池。以下是它如何更有意义:

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 

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

关于“自动释放对象将留在它们创建的方法/函数的持续时间”的说明是过于简单化,并且它假定您正在做的事情是“可可方式”。在main()中放置“真正的代码”并不是Cocoa的方式,所以你会遇到更为直接的答案,这是其他人给你的完美答案。当您的自动释放池被刷新时,事情就会消失。

什么的说明实际上的意思是,当你在一个函数创建对象,可以肯定的是,对象可以呆在身边至少直到你的函数,结束,只要你不冲水自动释放池自己。这意味着如果您只使用该函数中的对象,则不需要在该函数中保留和释放该对象。如果你手动刷新自动释放池,你应该知道什么时候事情消失的实际规则(同样,frenetisch applaudierend在这里是正确的),并且大多忽略简化。