2012-06-19 56 views
0

我知道這已經在(有點)之前得到了回答,但是我一直在閱讀衝突的答案,確切地說何時或何時不發佈未經過特定子類化的對象分配。關於何時發佈對象的更明確的答案

例如,如果我做到以下幾點:

@property (..., retain) NSMutableArray *myArray; 

或在一般情況下,

@property (some retain attribute - strong, weak, retain) type myObject; 

綜合化以後,如果我什麼都不做別的myObject的(不分配,甚至忘記使用它),有什麼情況下我仍然有責任釋放它?

+1

ARC or not ????? –

回答

3

根據您是否使用ARC,有兩種完全不同的答案。由於ARC環境非常簡單,我只能從ARC前的角度回答。要理解的主要是所有圍繞屬性的討論保留語義只是從主要點分心:如果你擁有所有權,你必須放棄它。放棄所有權通過-release完成。所以,你需要了解的是「什麼纔算佔有?」

按照慣例,只要您向包含[new,alloc,retain,copy]中的任何一個的類發送消息,您現在就擁有該對象。編譯器根據您指定的所有權策略爲Objective C Properties生成setter方法。所以,現在

- (void)setMyArray:(NSMutableArray *)myArray 
{ 
    // This is oversimplified, just to illustrate the important point. 
    // Again, this is NOT the way a setter would actually be synthesized. 
    [_myArray release]; 
    _myArray = [myArray retain]; 
} 

,當你這樣說self.myArray = someArray,你知道你發送一個retain消息:例如...

@property (..., retain) NSMutableArray *myArray; 
@synthesize myArray = _myArray; 

這會生成看起來像這樣的方法到someArray,你有責任在稍後發佈它。做到這一點的理想方法是說self.myArray = nil,因爲它在保留nil之前釋放舊值。請注意,發送該消息也是絕對安全的,即使您從未對myArray屬性設置任何內容,因爲發送消息到nil也沒問題。這就是爲什麼當你完成它們時,總是設置擁有的屬性到nil,無論它們如何被使用。


對於研究如何存取應該實際工作,看this article

+0

啊,謝謝!是的,我的意思是沒有ARC。儘管從我讀過的內容來看,即使設置了ARC,也會出現這種情況,但您仍然對版本負責。但是,除此之外,由於在某些情況下我不確定(比如你只是用對象填充保留的NSMutable數組並且從不直接分配它們),所以我一直設置爲零,並且不確定,我也發佈了它們! - 資助者1小時前 – fundtimer

相關問題