2011-03-30 147 views
0

如果我有一個名爲Catalog的對象,它有一個名爲「title」的(非原子性,保留)attrib。我做「[attrib發佈];」在目錄的dealloc方法中:Objc對象釋放內存管理

-(void)dealloc { 
    [title release], title = nil; 
    [super dealloc]; 
} 

後來我做了「Catalog * c = [Catalog new];」。

比較1:

dto.title = [[NSString的頁頭] initWithFormat:@ 「...」,...];

2:

dto.title = [NSString的stringWithFormat:@ 「...」,...];

這是釋放對象的所有attribs在dealloc方法的常識,但如果我一起的存取方法通過(已具有自動釋放)?我應該釋放還是不釋放dealloc中的accessor'd屬性呢?

回答

4

您的title二傳手保留字符串,所以它需要在-dealloc被釋放。你的第一個案例是錯誤的...你正在調用+ alloc然後是+ stringWithFormat :.我懷疑你的意思是-initWithFormat :.另外,你需要釋放字符串,因爲你正在分配它。它的醜陋和不可靠的調用-release上的屬性,所以它通常使用一個臨時變量爲這樣的事情:

NSString *string = [[NSString alloc] initWithFormat:...]; 
dto.title = string; 
[string release]; 
+0

+1好的答案,但它可能會更好,因爲使用+ stringWithFormat:避免需要臨時變量。 – 2011-03-30 21:04:06

+0

我正在處理這個問題的第一個案例。第二種情況使用+ stringWithFormat,我同意不需要temp變量,因爲不需要釋放字符串。稍作編輯的答案,以減少歧義。 – Caleb 2011-03-30 21:28:03

1

如果訪問已經有一個自動釋放,那麼不要再在dealloc中釋放出來。新的+ copy + alloc計數必須與release + autorelease計數相匹配。

+0

在-dealloc的 - 釋放與從屬性的保留。 – Caleb 2011-03-30 18:57:31

+0

自動釋放的東西的壽命是這樣的,自動釋放的對象永遠不會安全地成爲實例變量的值。即第一句話的含義完全錯誤;如果它是一個實例變量,它應該被保留或明確描述爲弱。不管它是否被自動釋放,都不是討論的一部分。 – bbum 2011-03-30 19:14:35

+0

@bbum如果他在alloc後一段時間自動釋放,那麼他不應該在dealloc方法中再次釋放它。我並不是說在這種情況下使用autorelease是個好主意,我只是在回答問題時提出了問題。 – Rayfleck 2011-03-30 20:12:11