當實例方法返回一個使用便利構造函數初始化的值時,是否需要保留該對象,然後在返回中自動釋放,以便當便利構造函數的autorelease發生時,它不會不要刪除對象。通過「便利構造函數」初始化的返回對象
這個版本會在調用代碼之前描述並取得保留或所有權嗎?
- (NSStringMutable *)test {
NSMutableString *description = [NSMutableString stringWithString:@"Test Value"];
return description;
}
還是應該是這樣?
- (NSStringMutable *)test {
NSMutableString *description = [NSMutableString stringWithString:@"Test Value"];
[description retain];
return [description autorelease];
}
長途區號:
NSMutableString *testVar = [[NSMutableString alloc] initWithString:[object description]];
+1這回答了問題 – Abizern 2009-08-12 15:11:08
你是對的,但儘量避免談論保留計數,他們是一個紅鯡魚 - 沒有保證NSMutableString會返回一個自動釋放對象,只是它返回一個可變字符串,你目前不擁有。您可以將結果安全返回到您的調用僅僅是因爲內存managemnt規則明確地說:「這方法也可以安全地將對象返回到它的調用」。 –
2009-08-13 03:14:37
這是一個很好的觀點。我發現從保留數量的角度來思考解釋事物是很方便的。你是對的 - 你知道的只是stringWithString返回一個其他人擁有的對象。在這種情況下,由於NSMutableString實際上分配了該對象,因此NSMutableString負責釋放它。 雖然我覺得這些便利構造函數(非init構造函數)通常會返回自動釋放對象。如果我遇到不以這種方式行事的人,我會感到驚訝。 – 2009-08-14 19:44:32