天天看點

iOS開發那些事-性能優化–autorelease的使用問題

在mrr中釋放對象通過release或autorelease消息實作,release消息會立刻使引用計數-1釋放,發送autorelease消息會使對象放入記憶體釋放池中延遲釋放,對象的引用計數并不真正變化,而是向記憶體釋放池中添加一條記錄,直到當池被銷毀前會通知池中的所有對象全部發送release消息真正将引用計數減少。

由于會使對象延遲釋放,除非必須,否則不要使用autorelease釋放對象,在ios程式中預設記憶體釋放池的釋放是在程式結束,應用程式入口main.m檔案代碼如下:

代碼被包裹在@autoreleasepool {… }之間,這是池的作用範圍,預設是整個應用。如果産生大量對象采用autorelease釋放也會導緻記憶體洩漏。那麼什麼時候autorelease是必須呢?我們看看下面代碼:

其中的cell對象不能馬上release,我們需要使用它設定表視圖畫面。autorelease一般應用于為其它調用者提供對象的方法中,對象在該方法不能馬上release,而需要延遲釋放。

此外,還有一種情況下使用了autorelease,即前文提到的“類級構造方法”:

nsstring *message = [nsstring stringwithformat:@"您選擇了%@隊。", rowvalue];

該對象的所有權雖然不是目前調用者,但它是由ios系統通過發送autorelease消息放入到池中的,當然這一切對于開發者都是不可見的,我們也要注意減少使用這樣的語句。

繼續閱讀