我试图了解何时调用autorelease,以及这实际上会对我的对象做些什么。
在Mac Developer Library中阅读About Memory Management后,我了解到当你有一个充当工厂方法的方法时 - 通过创建一个新对象并返回它 - 该方法无法在返回之前释放该对象它,因为这会导致返回一个deallocted对象。
示例
- (Test *) createNewTest
{
Test *newInstance = [[Test alloc] init];
[newInstance release];
return newInstance; // deallocted object returned.
}
相反,我应该使用autorelease
:
由NSObject定义的自动释放方法标记接收器以便以后发布
我的问题是:如果要稍后发布该对象,我怎么知道它何时被释放?
- (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
方法中安全地使用返回的自动释放对象?我应该保留createNewTest
返回的对象吗?或者我可以在runIt
范围内安全地使用它吗?
答案 0 :(得分:12)
将自动释放的对象添加到自动释放池中。
自动释放池中的对象在主runloop迭代结束时释放(或者如果您管理自己的自动释放池和/或如果您调用drain,则会更快)。
当你调用一个返回自动释放对象的方法时,它几乎保证有效,直到至少调用它的范围结束。
如果你想确保它保持更长时间,那么你应该保留它,记得在你完成它时再次释放它。
答案 1 :(得分:0)
我如何安全地使用返回的 我的runIt中的自动释放对象 方法,如果我不知道什么时候 autorelease trigger?
自动释放将在当前运行循环结束后触发。
我应该保留返回的对象吗? createNewTest?或者我可以安全 在runIt范围内使用它?
您可以在runIt范围内安全地使用它。
答案 2 :(得分:0)
最好保留对象并在使用后释放它。
答案 3 :(得分:-1)
负责创建它的人和调用runIt的人必须保留该对象。当责任人完成后,它应该释放对象。