Objective-C自动释放内存pipe理

我试图了解何时调用autorelease,以及这将实际做我的对象。

在阅读关于 Mac开发者库中关于内存pipe理的内容之后,我明白当你有一个充当工厂方法的方法时 – 通过创build一个新的对象并返回它 – 在返回对象之前,该方法没有办法释放对象,导致返回一个释放的对象。

- (Test *) createNewTest { Test *newInstance = [[Test alloc] init]; [newInstance release]; return newInstance; // deallocted object returned. } 

相反,我应该使用autorelease

由NSObject定义的autorelease方法标记接收器以供以后发布

我的问题是:如果稍后要发布对象,我怎么知道它被释放的时间?

 - (Test *) createNewTest { Test *newInstance = [[test alloc] init]; [newInstance autorelease]; return newInstance; } - (void) runIt { Test *myInstance = [self createNewTest]; // when is myInstance released?? and thereby not valid to my function anymore? } 

我怎么能安全地使用我的runIt方法中的返回的autoreleased对象,如果我不知道什么时候autorelease发生? 我应该保留由createNewTest返回的对象吗? 或者我可以在runIt范围内安全地使用它吗?

自动释放的对象被添加到自动释放池。

autorelease池中的对象在主循环的迭代结束时被释放(或者如果你正在pipe理自己的自动释放池和/或如果调用drain,则会更快)。

当你调用一个返回一个自动释放对象的方法时,它几乎保证保持有效,直到至less被调用的作用域的末尾。

如果你想确保它活得更长,那么你应该保留它,记住当你完成它时再次释放它。

我如何安全地使用我的runIt方法中的返回的autoreleased对象,如果我不知道什么时候autorelease触发器?

当前运行循环结束后,自动释放将触发。

我应该保留由createNewTest返回的对象吗? 或者我可以安全地在runIt范围内使用它吗?

您可以在runIt范围内安全地使用它。

它更好地保留该对象,并在使用后释放它。

负责创build它的人和调用runIt的人必须保留这个对象。 当负责人完成后,应该释放该对象。