編寫高質量iOS與OS X程式碼的52個有效方法(五)

眯大帥發表於2018-01-24

##記憶體管理 ###引用計數工作原理 NSObject 協議宣告瞭下面三個方法用於操作計數器,以遞增或遞減其值 retain 遞增引用計數 release 遞減引用計數 autorelease 稍後清理“自動釋放池”時,在遞減引用計數

編寫高質量iOS與OS X程式碼的52個有效方法(五)

為避免在不經意間使用了無效物件,一般呼叫完release 之後都會清空指標。這就能保證不會出現可能指向高無效物件的指標,這種指標通常稱為 dangling pointer 。 ###屬性存取方法中的記憶體管理 若屬性為“strong”所修飾時,設定的屬性值會保留。

-(void)setFoo:(id)foo{
  [foo retain];
  [_foo release];
  _foo = foo;
}
複製程式碼

此方法先保留新值,並釋放了舊值,然後更新例項變數,令其指向新值。順序很重要。假如還未保留新值就先把舊制釋放了,而且兩個值又指向同一個物件,那麼限制性的release操作就可能導致系統將此物件永久回收。而後續的retain操作則無法令這個已經徹底回收的物件復生,於是例項變數就成了懸掛指標。 ###return cycle 使用引用計數機制時,經常要注意的一個問題就是 return cycle,就是呈環形狀相互引用多個物件,這將導致記憶體洩露,因為迴圈中的物件其保留計數不會降為0。對迴圈中的每一個物件來說,至少有另外一個物件引用著它,垃圾回收器會把相互引用的物件全部回收走,而OC 引用技術架構中,則享受不到這種便利,通常採用 weak reference 來解決次問題,從而避免記憶體洩露。

引用計數機制通過可以遞增遞減的計數器來管理記憶體。物件建立好後,其保留計數至少為1.若保留計數為正,則物件繼續存活。當保留計數降為0時,物件就被銷燬了。 在物件生命期中,其餘物件通過引用來保留或釋放此物件。保留與釋放操作分別會遞增及遞減保留計數。

##以ARC簡化引用計數 ARC環境下回自動執行retain release autorelease dealloc,所以在ARC呼叫這些方法是非法的 在ARC之後,程式設計師就無須擔心記憶體管理問題了。使用ARC來程式設計,可省去類中的許多樣板程式碼。 ARC管理物件生命期的辦法基本上就是:在合適的地方插入保留及釋放操作。在ARC環境下,變數的記憶體管理語義總是通過方法名來體現。ARC將此確定為開發者必須遵守的規則。 ARC只負責管理Objective-C物件的記憶體。尤其要注意:CoreFoundation物件不歸ARC管理,開發者必須適時呼叫CFRetain/CFRelease。

##在dealloc方法中只釋放引用並解除監聽 在dealloc方法裡,應該做的事情就是釋放指向其它物件的引用,並取消原來訂閱的鍵值觀測或NSNotificationCenter等通知,不要做其他事情。 如果物件持有檔案描述符等系統資源,那麼應該專門編寫一個方法來釋放此種資源。這樣的類要和其使用者約定“用完資源後必須呼叫close方法。 執行非同步任務的方法不應在dealloc裡呼叫;只能在正常狀態下執行的那些方法也不應在dealloc裡呼叫,因為此時物件已處於正在回收的狀態了。

##以弱引用避免重複引用 將某些引用設為weak,可避免出現重複引用。 weak引用可以自動清空,也可以不自動清空。自動清空是隨著ARC而引入的新特性,由runtime來實現,在具備自動清空功能的弱引用上,可以隨意讀取其資料,因為這種引用不會指向已經回收過的物件。

相關文章