如何耗尽当前的自动释放池?

Posted

技术标签:

【中文标题】如何耗尽当前的自动释放池?【英文标题】:How do drain current auto release pool? 【发布时间】:2017-05-31 05:24:25 【问题描述】:

通常,我们调用@autoreleasepool 来清空ARC 中的自动释放池。

@autoreleasepool 
    MyObject* object = [[MyObject alloc] init];

//do something

现在我希望在调用 MyFunction 时清空所有 MyObject 对象。

- (void)MyFunction

    //[[NSAutoReleasePool defaultAutoReleasePool] drain];
    //do something

我知道@autoreleasepool 创建了一个新池。我只想要MyFunction 排空默认池或当前池,这样可以确保自动释放池中所有未使用的MyObject 在常见情况下被排空。

这可能吗?

【问题讨论】:

【参考方案1】:

@autoreleasepool ... 创建和删除(排出)一个新的自动释放池。您不能手动排空当前的自动释放池。有时可能需要释放池中的对象。在这种情况下,您应该使用嵌套池,例如:

@autoreleasepool  // Initial pool
    ...
    for(...) 
        @autoreleasepool 
            // Using large amount in ARP
        
    
    ...

顺便说一句:您的第一个列表中的对象不是 ARP 的成员,因为它是 alloc-init 调用的结果,因此您拥有它的所有权(请参阅 Memory Management Rules)。

【讨论】:

以上是关于如何耗尽当前的自动释放池?的主要内容,如果未能解决你的问题,请参考以下文章

OS X 应用程序的自动释放池在哪里创建和耗尽?

iphone:多次自动释放对象

当自动释放池耗尽时,NSFileAttributes dealloc 中的 SIGSEGV SEGV_ACCERR 崩溃?

什么时候触发自动释放池

iOS自动释放池_原理_如何工作

iOS自动释放池_原理_如何工作