我已经理解了@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”块?
答案 0 :(得分:3)
你可以在代码的任何部分放置一个@autoreleasepool
块,但是你真的不应该做我认为你正在做的事情。
自动释放的效率远低于允许ARC为您添加保留和释放呼叫的效率,而且可能不安全。 Autorelease将所有对象放在“池”中,然后当您超出范围和/或每当它决定转储池时,它“消耗”池并且对象的保留计数减1。
简短回答:完全省略@autorelease
块,除非Apple在文档或模板中另有说明(例如,main.m中将包含@autoreleasepool
。)
这意味着您的对象可能会在您真正想要它们之前被释放。当你有一个非常紧密的代码循环来实例化然后丢弃大量的对象时,@autoreleasepool
块更有用。例如,一个for循环,它处理一个巨大的数据库并分配字符串对象,然后使用这些字符串对象来填充您创建的类的实例的属性。在这种情况下,当你在for循环中时,ARC可能无法可靠地释放这些对象,你可能需要创建一个自动释放池。
然而,ARC在紧密循环中没有做正确的事情并不常见。它实际上更像是一个非ARC概念,你使用NSAutoreleasePool
并手动排空它。