1、循環引用和總結(內存管理的經典問題)code
對象A retain對象B,同時對象B retain對象A。這時兩個對象A和B都沒有辦法獲得釋放。這種狀況咱們稱之循環引用。以下示:
對象
//B類中設置A - (void)setA:(A *)a { if(_a != a) { [_a release]; _a = [a retain]; } } - (void)dealloc { [_a release]; [super dealloc]; } |
//A類中設置B - (void)setB:(B *)b { if(_b != b) { [_b release]; _b = [b retain]; } } - (void)dealloc { [_b release]; [super dealloc]; } |
2、內存管理總結內存
當你使用new、alloc或copy方法建立一個對象時。該對象的引用計數爲1。當不在使用該對象時,你要負責向該對象發送一條release或者autorelease消息。這樣,該對象將在其使用對象結束時銷燬。
內存管理
你經過任何其餘方法得到一個對象時,則假設該對象的引用計數爲1,並且已經被設置爲自動釋放,你不須要執行任何方法來釋放對象。若是你打算在一段時間內擁有該對象,則須要保留它並確保在操做完成時釋放它。
table
若是你保留了某個對象,你須要釋放或自動釋放該對象。必須保持retain方法和release方法的使用次數相等。
class
除了alloc、new或copy以外的方法建立對象都被聲明瞭autorelease。誰retain,誰release。只要你調用了retain,不管這個對象是如何生成的,你都要調用release。
循環