BWThread
繼承自NSThread
, 重寫-dealloc
方法以下圖Main.storyboard
中結構以下ViewController
中代碼以下push
到ViewController
中, 有以下打印block
後, 會當即釋放掉RunLoop
, 只有在主動獲取RunLoop
時纔會建立(主線程中的RunLoop由系統自動建立)RunLoop
來對線程保活RunLoop
對線程進行保活的時候, 不能僅僅運行就好了, 由於RunLoop
當前執行的_currentModel
中若是沒有Sources0, Sources1, Timers, Observers
, 那麼RunLoop
會自動退出RunLoop
處理, 這樣RunLoop
纔不會退出thread
留在了內存中, 沒有被釋放thread
, 而後在touchesBegan:withEvent:
方法中,給子線程添加事件thread
保持活性, 依然在能夠事件RunLoop
, 能夠看到,不論怎麼點擊屏幕, 都不會再有事件, 此時thread
就會失活, 因此就算被ViewController
強引用, 依然沒法保持thread
的活性ViewController
重寫-dealloc
方法, 能夠發現當ViewController
退出被銷燬時, thread
依然留在了內存中, 沒有被釋放, 說明thread
發生了內存泄漏咱們能夠經過中止RunLoop
的運行, 來釋放thread
oop
在ViewController
上添加一個按鈕, 咱們要在點擊釋放
按鈕時, 將RunLoop
中止線程
ViewController
中代碼以下, 當點擊釋放
按鈕時, 在thread
中中止RunLoop
釋放
按鈕, 能夠發現RunLoop
並無被中止, 點擊屏幕依然觸發事件RunLoop
的-run
方法的介紹-run
方法裏面, 其實是一個死循環, 在不停的調用-runMode:beforeDate:
方法CFRunLoopStop(CFRunLoopGetCurrent())
釋放掉的, 只不過是其中某一次循環中的-runMode:beforeDate:
而已RunLoop
的時候, 須要使用-runMode:beforeDate:
方法, 而不是-run
方法thread
在執行一次事件以後就會失活, 因此咱們須要對-runMode:beforeDate:
進行循環處理釋放
以後RunLoop
依然在工做這是由於-runMode:beforeDate:
被中止後, 經過循環又進行了一次-runMode:beforeDate:
3d
因此, 咱們須要使用一個標識來控制是否循環-runMode:beforeDate:
code
thread
的存活了ViewController
銷燬, 能夠看到thread
也銷燬了thread
隨着ViewController
釋放一塊兒釋放ViewController
後直接退出, 能夠發現ViewController
被釋放了, 而thread
並無釋放-dealloc
中執行-freeThread:
方法, 執行程序stop
方法後, thread
依然沒有被釋放ViewController
的-dealloc
方法執行時,ViewController
已經處於被釋放的狀態, 當須要執行到stop
時, ViewController
已經被釋放thread
的任務-stop
執行完以後, 在執行後面的代碼-stop
執行完以後才執行的-dealloc
, 說明-stop
執行完以後, ViewController
才被釋放thread
依然沒有被釋放RunLoop
被中止, 再次進入while
循環判斷的時候ViewController
已經被釋放, 此時的weakSelf
的值爲nil
, 因此!weakSelf.isStop
的值爲YES
, 再次進入了循環, 啓動了RunLoop
weakSelf
必須有值的條件語句ViewController
退出時, thread
也跟着正常釋放ViewController
時崩潰的問題ViewController
後, 先點擊釋放
按鈕, 使thread
失活後再次pop
掉ViewController
, 就會發生運行時錯誤waitUntilDone
設置爲YES
, 程序會等thread
執行完以後再執行後面的代碼, 此時thread
已經失活, 因此纔會出現運行時錯誤thread
以後, 將self.thread
置空, 再加入下面的判斷, 就可保證程序的正常運行ViewController
後, 先點擊釋放
按鈕, 使thread
失活後再次pop
掉ViewController
, 能夠看到程序正常運行ViewController
和thread
也都被釋放了