2011-11-03 102 views
0

我想了解iOS上的內存管理。我創造了這個接口:保留/分配內存管理

@interface Player : NSObject { 
    PlayerType pType; 
    PlayerWeapon pWeapon; 
} 

@property(nonatomic, readwrite, retain) pType; 
@property(nonatomic, readwrite, retain) pWeapon; 

@end 

,這在實現文件:

@synthesize pType; 
@synthesize pWeapon; 

在頭文件中,我使用retain屬性,因爲P-型和pWeapon不是標準C的結構。據我所知,如果他們是C結構,我會用assign來代替。由於我使用了retain,這是否意味着此類保留了該對象或哪個類實例化了它?例如,如果我這樣做的另一個類:

Player *player = [[Player alloc] init]; 

這個新的類必須調用[player release]或將對象自動被釋放?

回答

1

一個好的,一般的規則是,無論你分配/初始化或複製你有「創建」和擁有,因此你將不得不釋放它。所以是的,擁有播放器的對象在使用播放器時需要釋放它。這適用於Player對象是爲方法內的本地範圍創建的,或者它是一個ivar。

請記住,如果您決定創建一個自動釋放Player對象,您需要通過屬性點語法或實際保留消息來保留該對象,以防止Player對象在本地方法之後被自動釋放完成執行。

// Retaining an autoreleased object 
self.player=[Player playerWithName: @"George"]; 

player=[[Player playerWithName: @"George"] retain]; 

好運

+0

感謝您的解釋。如果我沒有在我的頭文件中加入'retain'或'assign',那會有什麼不同?只有在使用屬性點語法時才使用 – XSL

+1

。即self.player。頭文件中的保留是告訴編譯器爲各個ivar創建一個setter和getter方法。 – timthetoolman

0

[[Player alloc] init]的調用者負責發送新的Player對象release消息。 Player對象的屬性不影響該責任。

1

當你「保留」的編譯器生成setter方法屬性需要確保對象的責任是釋放和保留正確。該屬性本質上處理釋放之前引用的對象並保留(取得所有權)被分配的對象的工作。您還需要在實現文件來釋放這些對象添加以下代碼當玩家對象被釋放:

- (void) dealloc 
{ 
    [pType release]; 
    [pWeapon release]; 
    [super dealloc]; 
} 

這意味着,即使內部屬性是「保留」,當「播放器」對象被分配,你仍然必須在某個時候釋放它。