【问题标题】:Arc and autoreleasepool弧和自动释放池
【发布时间】:2014-09-02 14:20:09
【问题描述】:

我注意到下面显示的代码发生了一些对我来说似乎很奇怪的事情,我想了解到底发生了什么以及为什么。我正在使用 ARC。

int main(int argc, const char * argv[])
{

@autoreleasepool {

    NSMutableDictionary *d1=[[NSMutableDictionary alloc]init];

    NSLog(@"before loop");
    for (int i=0; i<1000; i++) {
        NSLog(@"looping");
    }


    NSLog(@"before autoreasepool block end");

}

 NSLog(@"after autoreasepool block end");
return 0;

}

作为输出,我得到:

...
2014-07-11 21:48:20.637 testARC[24786:303] looping
2014-07-11 21:48:20.638 testARC[24786:303] looping
2014-07-11 21:48:20.638 testARC[24786:303] before autoreasepool block end
2014-07-11 21:48:20.638 testARC[24786:303] freed
2014-07-11 21:48:20.639 testARC[24786:303] after autoreasepool block end

在调用 d1 的 dealloc 方法时将 freed 写在哪里。

我的问题是:在我看来 d1 正在自动发布,而我认为它不应该。 如果我自己编写释放和保留调用,我会在循环之前释放 d1,而不是在自动释放块的末尾,我假设 ARC 应该做同样的事情,不是吗?

提前致谢。

【问题讨论】:

    标签: objective-c automatic-ref-counting autorelease


    【解决方案1】:

    这里没有自动释放;直到范围结束才发布。您可以通过在 d1 赋值周围放置大括号来证明这一点。您会看到它会在超出范围时被释放,而不是在自动释放池耗尽时。

    ARC 没有义务缩短对象的生命周期。在某些情况下只允许优化器这样做。这应该是允许的情况之一(因为这是local variable of automatic storage duration,所以您可能想向编译器团队提出增强请求,但这不是错误。


    我的意思是:

    int main(int argc, const char * argv[])
    {
    
    @autoreleasepool {
    
        { // These limit the scope of d1
          NSMutableDictionary *d1=[[NSMutableDictionary alloc]init];
        } // These limit the scope of d1
    
        ...     
    }
    
     NSLog(@"after autoreasepool block end");
    return 0;
    }
    

    但在大多数情况下,您应该将它们分解为它们自己的函数。

    【讨论】:

    • 好吧,我给你展示了一个愚蠢的例子,但我的实际问题是我沿着主函数分配了十几个 NSMutableDictionary 对象,每个对象有数百个条目,即使它们没有被释放不再需要,有什么技巧可以在不再需要它们时立即释放它们?我可以将他们的每一个分配+使用放在自动释放块中,并且在退出块时它们会因超出范围而被释放,但由于它们不是自动释放的,它更像是一种黑客而不是一种解决方案......谢谢
    • 你不需要自动释放块。你只需要范围界定。将 {} 放在它周围。但这表明您可能在单个函数中发生了太多事情。你不应该有几十个变量在范围内但没有被使用。
    猜你喜欢
    • 1970-01-01
    • 2013-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-18
    • 2011-08-04
    • 2021-10-28
    • 1970-01-01
    相关资源
    最近更新 更多