在 Objective-C 中如何处理 Autorelease 池中的对象?
Posted
技术标签:
【中文标题】在 Objective-C 中如何处理 Autorelease 池中的对象?【英文标题】:How objects in Autorelease pools are handled in Objective-C? 【发布时间】:2010-07-08 06:33:25 【问题描述】:我的问题是一个对象何时真正添加到自动释放池中? 当创建自动释放池并在范围内声明对象时,它们是添加到自动释放池中还是在指定为自动释放时添加到池中。
int main(void)
NSAutoreleasePool *pool;
pool = [[NSAutoreleasePool alloc] init];
NSString *string;
NSArray * array;
string = [[[NSString alloc] init] autorelease];
array = [[NSArray alloc] init];
/* use the string */
[pool drain];
在这种情况下,只是将字符串添加到池中,还是将数组添加到池中?
【问题讨论】:
【参考方案1】:当-autorelease
被调用时,对象被添加到自动释放池(是的,池,每个线程有一个堆栈),并且只有在那时。但是,在不包含“new”、“alloc”或“copy”(或多或少,我可能会忘记一两个)的方法中,返回的值通常会在返回之前为您自动释放.您真的应该完整阅读memory management guide(这并不那痛苦)。
【讨论】:
感谢 Jared 的回复。我还有一个疑问是当我创建嵌套池时,我可以使用嵌套池中的对象作为自动释放,其中对象是在父池中创建的。 @Cathy:是的,你可以,但这可能会混淆内存管理——正如文档所说,不要发布你没有创建或保留的东西。基本上我想不出你会干净地做到这一点的情况,尽管它在技术上绝对没问题,只要你不过度释放它(通过自动释放它两次)【参考方案2】:对象被添加到自动释放池只有当它们被发送自动释放方法时。
自动释放池堆栈,并且对象仅在发送自动释放时添加到堆栈中最顶层的池(最近创建的)。
但是,自动释放池本身实际上位于堆栈的下一个池中。因此,如果您排空最旧的池,则此后创建的所有池也将被排空。这在抛出异常的情况下很重要。它可以通过其中包含自动释放池的堆栈帧引发异常,而不会泄漏池或其中的对象。
【讨论】:
以上是关于在 Objective-C 中如何处理 Autorelease 池中的对象?的主要内容,如果未能解决你的问题,请参考以下文章
SpringBoot.09.SpringBoot中如何处理Filter抛出的异常