1

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

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

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

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

在 dealloc 方法中,我无法将发布消息发送到字典,因为我在 ARC 下。所以当我通常分配内存时,我会这样做:

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

PS:请原谅语法错误,我是直接写的,没有编译。
但是在课堂上,我应该把“@autoreleasepool”块放在哪里?

4

1 回答 1

3

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

与允许 ARC 为您添加保留和释放调用相比,自动释放效率要低得多,而且它可能不安全。Autorelease 将所有对象放入“池”中,然后当您超出范围和/或决定转储池时,它会“耗尽”池并且对象的保留计数减一。

简短的回答:@autorelease除非 Apple 在文档或模板中另有说明(例如,main.m 中会有一个@autoreleasepool),否则完全忽略这些块。

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

但是,ARC 在紧密循环中不做正确的事情并不常见。它实际上更像是一个非 ARC 概念,您可以在其中使用 anNSAutoreleasePool并手动将其耗尽。

于 2012-06-10T12:04:16.100 回答