2011-01-25 75 views
13

我見過很多與代表有關的帖子,我想知道引用它們的正確方法。假設我有一個對象聲明如下:代表 - 保留或分配 - 釋放?

@interface MyViewController : UITableViewController { 
    id delegate;  
} 
@property (nonatomic, retain) id delegate; 
@end 

通過對MyViewController的生命週期,它將使其委託的方法的調用響應與用戶的交互。

當它的時間來擺脫MyViewController實例的,莫非是delegate伊娃需要在實施的dealloc方法release「版,因爲它是與retain聲明?

或者相反,應該保留delegate?也許它應該是@property (nonatomic, assign) id delegate?據Apple's docs

保留...您通常使用該屬性的標量類型,如NSInteger的和的CGRect,或(在引用計數環境)爲對象,你並不擁有如代表。

通常情況下,我只想跟文檔說的一樣,但是我看到很多代碼在代理上調用retain。這只是「錯誤的代碼?」我請這裏的專家......處理這個問題的正確方法是什麼?

回答

21

您通常希望分配代表而不是保留它們,以避免在對象A保留對象B和對象B保留對象A時的循環保留計數。(您可能會看到這被稱爲保留「弱引用」 。委託)例如,考慮下面的共用圖案:

-(void)someMethod { 
    self.utilityObject = [[[Bar alloc] init] autorelease]; 
    self.utilityObject.delegate = self; 
    [self.utilityObject doSomeWork]; 
} 

如果utilityObjectdelegate和屬性都聲明使用retain,然後self現在保留self.utilityObjectself.utilityObject保留self

有關更多信息,請參閱Why are Objective-C delegates usually given the property assign instead of retain?

如果您分配委託而不是保留委託,那麼您無需擔心在dealloc中釋放委託。

1

它通常表示設計不好,因爲大多數代表保留了它們的對象(創造了留住循環的潛力並因此泄漏)。但是在某些情況下對象應該保留它的代表。通常情況下,對象沒有可用的引用,因此委託人不能保留它 - 但是它本身有時可能表示設計不好。

0

我也聽到很多意見。我不知道正確的方法,但我可以告訴你我通過自己的工作得到了什麼。

你想retain任何你需要保存你的句柄。這是所有權,在參考計數的環境中。這是一個聲明,「我以後需要這個,不要讓它離開我」。

這也意味着你有責任釋放你的要求。如果你沒有具體這樣做,你很容易出現各種問題,但特別是處理可能會保留它們代表的對象的代表。如果你不處理你對代表的保留,所有權將是週期性的,並且對象將會泄漏。但不要忘記釋放你保留的東西,你會沒事的。