在 dealloc 方法中值釋放引用并解除監(jiān)聽
對象在經(jīng)歷其生命期后,最終會為系統(tǒng)所回收,這時就要執(zhí)行 dealloc 方法, 在每個對象的生命期內(nèi),此方法僅執(zhí)行一次, 也就是當保留計數(shù)將為 0 時, 然而具體何時執(zhí)行,則無法保證.
那么,應該在 delloc 方法中做些什么呢? 主要就是釋放所擁有的引用, 也就是把所有 OC 對象都釋放掉.
在 dealloc 方法中, 通常還要做意見事, 那就是把原來配置過的 觀測行為 都清理掉, 如果用 NSNotificationCenter 給此對象訂閱 過某種通知, 那么一般應該在這里注銷, 這樣的話,通知系統(tǒng)就不在把通知發(fā)給回收后的對象了.若是還向其發(fā)送通知, 則必然引起程序崩潰.
請注意: 如果手動管理引用計數(shù)而不使用 ARC 的話, 那么最后還需要調(diào)用 [super dealloc];
雖說應該于 dealloc 中釋放引用,但是開銷較大或 系統(tǒng)內(nèi)稀缺的資源則不在此列, 像是文件描述符, 套接字,大塊內(nèi)存 等, 都屬于這種資源, 不能指望 dealloc 方法必定會在某個特定的實時機調(diào)用, 因為有一些無法預料到的東西也持有此對象,在這種情況下, 如果非要等到系統(tǒng)調(diào)用 dealloc 方法時才釋放, 那么保留這些稀缺資源的時間就有些過長了. 這樣做不好, 通常的做法是,實現(xiàn)林外一個方法, 房應用程序用完資源對象后,就調(diào)用此方法, 這樣一來,資源對象的聲明周期 就變得更為明確 了.
總結(jié):
在 dealloc 方法里,應該做的事情就是釋放指向其他對象的引用, 并取消原來訂閱的 '鍵值觀測 (KVO)' 或 NSNotificationCenter 等通知, 不要做其他事情.
如果對象持有文件描述符 等系統(tǒng)資源,那么應該專門編寫一個方法來釋放此種資源,這樣的類要和其使用者約定: 用完資源后必須調(diào)用 close 方法
執(zhí)行異步任務的方法不應該在 dealloc 里調(diào)用, 只能在正常狀態(tài)下執(zhí)行的那些方法也不應再 dealloc 里面調(diào)用, 因為此時對象已處于正在回收的狀態(tài)了.