Objective-C自动释放内存管理

时间:2011-03-04 10:06:33

标签: ios iphone objective-c cocoa-touch

我试图了解何时调用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范围内安全地使用它吗?

4 个答案:

答案 0 :(得分:12)

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

自动释放池中的对象在主runloop迭代结束时释放(或者如果您管理自己的自动释放池和/或如果您调用drain,则会更快)。

当你调用一个返回自动释放对象的方法时,它几乎保证有效,直到至少调用它的范围结束。

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

答案 1 :(得分:0)

  

我如何安全地使用返回的   我的runIt中的自动释放对象   方法,如果我不知道什么时候   autorelease trigger?

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

  

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

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

答案 2 :(得分:0)

最好保留对象并在使用后释放它。

答案 3 :(得分:-1)

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