添加到該數組的對象是否會一直處於活動狀態,並且在分配數組時是不會釋放的?
他們會在正常情況下,即提供您不會讓他們過度放熱。例如,
// take ownership (alloc) followed by relinquish ownership (autorelease)
// the net result is that this code snippet DOES NOT own someObject
SomeClass *someObject = [[[SomeClass alloc] init] autorelease];
// myArray takes ownership of someObject
[myArray addObject:someObject];
// someObject is INCORRECTLY (over)released
[someObject release];
考慮,沒有其他的代碼已經奪去了someObject
所有權,也不會是「活」,因爲overreleased。
我知道將一個對象添加到數組將增加其保留數。這對自動釋放對象也有效嗎? (可能是來自其他方法的自動釋放陣列)
是的。集合不會在添加對象時查看保留計數或自動釋放狀態,也不應該這樣做。一個數組只需將-retain
發送給正在添加的對象,並因此獲取該對象的所有權,而不管擁有(或不擁有)對象的其他代碼。
內存管理和對象所有權的關鍵在於以相對的方式考慮所有權:如果集合需要一個對象,它將獲得對象的所有權;如果集合被釋放或者該對象從集合中被移除,它將放棄該對象的所有權。該集合不關心其他對象或代碼擁有的對象 - 它只關心擁有該對象的自己的視角。同樣的原則應該適用於你的代碼。
您不應該計算保留計數。就這樣。 – 2011-01-23 14:30:04
@Jacob Relkin我不打算計算保留計數值 - 我只是試圖給他更好的圖片如何工作。我看到很多人認爲,如果您添加一個對象到Autorelease池對象是由Autorelease池釋放的。 – 2011-01-23 14:55:32