在ViewController2中初始化timer并將ViewController2作為timer的target執(zhí)行事件,由于兩者之間存在互相引用導(dǎo)致不能正常釋放
一 在合適的時機釋放timer
-(void)didMoveToParentViewController:(UIViewController*)parent 這句代碼就是用來管理子視圖生命周期的,當(dāng)當(dāng)前視圖從父視圖移除的時候,就釋放timer的時機,就能讓ViewController2的生命周期回歸到一個正常的流程.
二 通過中間者解決
如圖通過runtime給target對象添加run方法,然后讓timer引用target,最后在析構(gòu)函數(shù)dealloc里釋放timer.
三 ?NSProxy消息轉(zhuǎn)發(fā)
和上面的方法類似也是通過中間者的方法來解決,創(chuàng)建一個繼承NSProxy的類并聲明一個屬性target
實現(xiàn)該類的兩個方法,1.獲取方法簽名 2.將消息轉(zhuǎn)發(fā)到屬性target.
初始化proxy設(shè)置target屬性為當(dāng)前控制器,并將proxy設(shè)置為timer的target,timer和self不再存在互相引用的問題.
四 改變初始化方法
蘋果提供了NSTimer的一種block的初始化方法,如此我們只需要解決block循環(huán)引用的問題就能正常釋放timer.
但是這種方法只能在ios10.0以后才能使用.不過我們可以通過分類自定義一個類似的初始化方法.
將block作為timer的參數(shù)傳遞到事件中并執(zhí)行回調(diào)
如此不受系統(tǒng)等級限制也能使用block的初始化方法.