一,現(xiàn)象
在輸入框輸入文字的時(shí)候,程序突然崩潰,出現(xiàn)如題所示的崩潰日志,初步認(rèn)定kCFRunLoopCommonModes的錯(cuò)誤是定時(shí)器沒關(guān)的問題.
仔細(xì)檢查剛剛 pop 出的控制器中的定時(shí)器,在該控制器退出的時(shí)候,確實(shí)沒有關(guān)閉定時(shí)器,因此會(huì)有輸入內(nèi)容的時(shí)候,定時(shí)器還在開啟,此時(shí)定時(shí)器得等輸入框的主線程執(zhí)行完之后,才會(huì)執(zhí)行定時(shí)器響應(yīng)函數(shù)......
等到定時(shí)器下一次啟動(dòng)的時(shí)候,碰到上一次沒有關(guān)閉的定時(shí)器,造成定時(shí)器阻塞.....進(jìn)而崩潰.
二,比較常見的崩潰
(參考:https://gold.xitu.io/post/584b787f128fe10058a162cb?utm_source=gold_browser_extension)
1.對(duì)數(shù)組進(jìn)行增刪改操作
- 在長(zhǎng)連接里面對(duì)數(shù)組進(jìn)行增刪改操作(子線程),又在定時(shí)器里面對(duì)數(shù)組進(jìn)行增刪改操作(主線程),有可能會(huì)造成數(shù)組越界而崩潰.
- (解決方案:使用@synchronized(<#token#>) { <#statements#>}鎖防止同時(shí)操作數(shù)組,可以參考以上網(wǎng)址中的方案,
設(shè)置readonly屬性,提供添加了鎖的訪問/設(shè)置方法;
函數(shù)中的 NSArray 或NSMutableArray使用前先 copy 到本地)
2. NSNotification
- 在添加的時(shí)候,沒有及時(shí)釋放,導(dǎo)致通知重復(fù)添加.
- 對(duì)于通知的名稱,最好統(tǒng)一管理
- 解決方案:
init 中創(chuàng)建 ,dealloc 中移除(可以多次調(diào)用以下方法,不會(huì)有什么影響)
盡量不要在viewDidLoad中創(chuàng)建,內(nèi)存警告時(shí)view是有可能unloaded再reloaded)
3. 子主線程處理UI事件
給 UIView 設(shè)置數(shù)據(jù)的時(shí)候,崩潰或某些視圖不顯示.
有可能是被子線程調(diào)用,進(jìn)而造成某些視圖不顯示,因此要用
dispatch_async(dispatch_get_main_queue(), ^{ })
來包裝一下.