Objective-C 自动释放内存管理

Posted

技术标签:

【中文标题】Objective-C 自动释放内存管理【英文标题】:Objective-C autorelease memory management 【发布时间】:2011-03-04 10:06:32 【问题描述】:

我试图了解何时调用自动释放,以及这将对我的对象产生什么实际影响。

在阅读了 Mac 开发人员库中的About Memory Management 之后,我了解到,当您有一个充当工厂方法的方法时——通过创建一个新对象并返回它——该方法无法在返回之前释放该对象,因为这会导致一个被释放的对象被返回。

示例

- (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 方法中安全地使用返回的自动释放对象?我应该保留createNewTest 返回的对象吗?或者我可以在runIt 范围内安全地使用它吗?

【问题讨论】:

btw - 根据 obj-c 命名准则,您的 createNewTest 方法应返回非自动释放对象,因为它的名称中包含“新”。 对象是用alloc实例化的,所以它必须被释放。 【参考方案1】:

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

自动释放池中的对象在主运行循环的迭代结束时释放(或者如果您正在管理自己的自动释放池和/或如果您调用 drain)。

当您调用返回自动释放对象的方法时,几乎可以保证它至少在调用它的范围结束之前保持有效。

如果你想确保它的存活时间更长,那么你应该保留它,记住在完成后再次释放它。

【讨论】:

您说“几乎可以保证”在调用工厂方法的方法中保留和释放是最佳做法吗?。 对象将在其范围内保持有效。如果你想要 100% 的想法,你可以保留/释放。 感谢您的回答 :) 我还有一个问题,如果 runIt() 将返回创建的对象,调用 runIt() 的方法是否也有一个安全对象:)? 是的,因为返回的对象将在调用者的范围内。【参考方案2】:

如何安全使用退回的 我的 runIt 中的自动释放对象 方法如果我不知道什么时候 自动释放触发器?

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

我应该保留返回的对象吗 创建新测试?或者我可以安全地 在 runIt 范围内使用它?

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

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

最好保留对象,使用后释放。

【讨论】:

以上是关于Objective-C 自动释放内存管理的主要内容,如果未能解决你的问题,请参考以下文章

Objective-C内存管理之自动释放池

Objective-C 自动释放内存管理

ios的内存管理

iOS开发系列—Objective-C之内存管理

iOS开发系列—Objective-C之内存管理

《Objective-C高级编程 iOS与OS X多线程和内存管理》读书笔记