2012-06-10 54 views
1

我已經理解了@autoreleasepool是如何工作的,我有支持ARC的xcode的最新版本。所以我可以使用它,但是我想知道它是如何在類中工作的。
讓我們假設我有這樣的接口:在ARC裏面使用@autoreleasepool

@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:原諒語法錯誤,I直接編寫而不編譯。
但是在課堂上,我在哪裏放置「@autoreleasepool」塊?

+2

順便說一下,LLVM編譯器中的一些新功能允許您在實現中聲明隱含私有的ivars。除了在你的頭文件接口文件中使用'@ private',刪除你在'@interface'下的4行並在你的.m實現文件中添加'{NSMutableDictionary * dictionary; ''執行''後面的行}。 –

回答

3

你可以在代碼的任何部分放置一個@autoreleasepool塊,但是你真的不應該做我認爲你正在做的事情。

Autorelease比允許ARC爲您保留和釋放呼叫添加效率低得多,並且它可能不安全。自動釋放將所有對象放入「池」中,然後當您超出範圍和/或每當它決定轉儲池時,它會「消耗」池,並且對象的保留計數會減1。

簡短回答:除非Apple在文檔或模板中另有說明(例如,main.m將包含@autoreleasepool),否則將@autorelease塊完全拋棄。

這意味着您的對象可能會在您真正需要之前被釋放。 @autoreleasepool塊當你有一個非常緊密的代碼循環將會實例化,然後丟棄大量的對象時,塊更有用。例如,for循環處理一個巨大的數據庫並分配字符串對象,然後使用這些字符串對象填充您創建的類的實例的屬性。在這種情況下,當你處於for循環內時,ARC可能不會可靠地釋放這些對象,並且您可能需要創建一個自動釋放池。

但是,ARC在緊密循環中沒有做正確的事情並不常見。這實際上更像是一個非ARC概念,在這個概念中你使用了NSAutoreleasePool,並且你手動排空它。