在类中的ARC中使用@autoreleasepool

时间:2012-06-10 11:50:36

标签: objective-c automatic-ref-counting

我已经理解了@autoreleasepool是如何工作的,我有最新版本的xcode支持ARC。所以我可以使用它,但我无法理解它在一个类中是如何工作的。
我们假设我有这个界面:

@interface AppDelegate : NSObject <NSApplicationDelegate>
{
@private
    NSMutableDictionary* dictionary;
}

我在init方法中分配并初始化字典:

- (id) init
{
    self= [super init];
    if(self)
    {
        dictionary=[[NSMutableDictionary alloc]init];
    }
    return self;
}

在dealloc方法中,我无法向字典发送释放消息,因为我在ARC.So。当我通常分配内存时,我做了类似的事情:

@autoreleasepool
{
    NSMutableDictionary* dict=[[NSMutableDictionary alloc]init];
    < use it>
}

PS:Pardon语法错误,我直接编写它而不编译。
但在课堂上,我在哪里放置“@autoreleasepool”块?

1 个答案:

答案 0 :(得分:3)

你可以在代码的任何部分放置一个@autoreleasepool块,但是你真的不应该做我认为你正在做的事情。

自动释放的效率远低于允许ARC为您添加保留和释放呼叫的效率,而且可能不安全。 Autorelease将所有对象放在“池”中,然后当您超出范围和/或每当它决定转储池时,它“消耗”池并且对象的保留计数减1。

简短回答:完全省略@autorelease块,除非Apple在文档或模板中另有说明(例如,main.m中将包含@autoreleasepool。)

这意味着您的对象可能会在您真正想要它们之前被释放。当你有一个非常紧密的代码循环来实例化然后丢弃大量的对象时,@autoreleasepool块更有用。例如,一个for循环,它处理一个巨大的数据库并分配字符串对象,然后使用这些字符串对象来填充您创建的类的实例的属性。在这种情况下,当你在for循环中时,ARC可能无法可靠地释放这些对象,你可能需要创建一个自动释放池。

然而,ARC在紧密循环中没有做正确的事情并不常见。它实际上更像是一个非ARC概念,你使用NSAutoreleasePool并手动排空它。