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 自动释放内存管理的主要内容,如果未能解决你的问题,请参考以下文章