現(xiàn)在已經(jīng)iOS11宛琅,還要適配iOS8??
在其他手機上都正常道川,就在iOS8上各種崩潰,都是崩潰的main函數(shù)割择。
崩潰復現(xiàn)-崩潰log
演示步驟:從VC1 push到 VC2眷篇,返回VC1 ,崩潰荔泳〗侗或再想push到VC2,崩潰玛歌。
主頁有四個頁面昧港,報錯還各不相同。
報錯1
-[UITableView release]: message sent to deallocated instance 0x15ea3a400
報錯2
[MDWordCC release]: message sent to deallocated instance 0x145d62d40
報錯3
-[MDTipsViewController respondsToSelector:]: message sent to deallocated instance 0x1570d7650
崩潰的位置為
(anonymous namespace)::AutoreleasePoolPage::pop
Thread 35: EXC_BAD_ACCESS (code=1, address=0x10a054000)
崩潰到mian函數(shù)
崩潰復現(xiàn)-調(diào)試的設置
首先添加全局斷點
添加全局斷點
首先打開僵尸對象
崩潰事可以打印一行l(wèi)ogProduct --> Scheme --> Edit Scheme --> Diagnositics
僵尸對象設置
上面設置完成以后支子,可以驗證崩潰現(xiàn)象了创肥,必現(xiàn)。
網(wǎng)上的答案
答案1 -- 對我無用
用malloc_history
查看系統(tǒng)的崩潰堆棧信息
sudo malloc_history 36674 0x7f906ca34790
但是 必須在模擬器上運行值朋,但是我們項目因為添加了三方模塊叹侄,用不了模擬器。
答案2 -- 對我有用
在dealloc
中清空代理deleagate = nil
答案3 -- 對我有用
設置文件-fno-objc-arc
這個有作用昨登,讓我很是稀奇??
答案4 -- 對我無用
重寫導航控制器的pop和push方法趾代,判斷是否有動畫結束或多次pop等等。
我解決的方案
第一次-- 用了答案3
設置VC2文件 為-fno-objc-arc
報錯丰辣,然后刪除了里面的所有weakself
運行正常撒强,能解決這個單文件的問題,pop出來不崩潰了笙什。
但是其他的頁面pop依然崩潰飘哨。
并且都用ARC了,這樣搞得湘,總感覺有點別別的??
但是的確有用杖玲,至于原理顿仇,不清楚淘正。摆马。。
第二次-- 用了答案2
把VC2的所有代理在dealloc
都置空鸿吆。
依然崩潰囤采。
最終解決方案
分成兩步:
第1步,把VC2的所有代理在dealloc
都置空惩淳。
清空代理
第2步蕉毯,發(fā)現(xiàn)項目中有個類NSObject+MDKVO.m
這個類應該是防止KVO多次添加或多次移除的。
把這個類代碼都刪除了
解決成功
分析原因
1 代理在dealloc中都應該置空思犁,不然在iOS8和9會出問題代虾,在iOS10和11 上沒有問題。
2 如果即使加全局斷點激蹲,依然崩潰在mian函數(shù)棉磨,很有可能是三個原因??????????????:
1,KVO
2学辱,KVC
3乘瓤,手勢,特別是添加到Window的上手勢
后續(xù)--非相關
在另一個頁面返回也會崩潰策泣,報錯內(nèi)容為
libc++abi.dylib: terminate_handler unexpectedly threw an exception
這個先記著衙傀,等后續(xù)再補。
后續(xù)--非相關 已解決
還是KVO的問題
在setModel 的時候萨咕,多次添加了KVO
開始是沒有問題的统抬,但是后來因為我把NSObject+MDKVO.m
文件代碼刪除了,所以又出現(xiàn)了這個問題危队。
解決方案
用FaceBook的 KVOController 三方框架
#import <KVOController/NSObject+FBKVOController.h>
相關代碼如下??
// 去掉原生的KVO代碼
//- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context
//{
// if ([keyPath isEqualToString:@"viewModel.isRead"]) {
// if (self.viewModel) {
// if ([change[NSKeyValueChangeNewKey] intValue] == 0) {
// self.wordLabel.textColor = color6;
// self.spellLabel.textColor = color8;
// } else {
// self.wordLabel.textColor = color1;
// self.spellLabel.textColor = color1;
// }
// }
// }
//}
- (void)dealloc
{
// 去掉原生的KVO代碼
// if (self.viewModel.indexPath) {
// [self removeObserver:self forKeyPath:@"viewModel.isRead"];
// }
}
- (void)setViewModel:(MDWordViewModel *)viewModel
{
_viewModel = viewModel;
if (viewModel.indexPath) {
// 去掉原生的KVO
// [self addObserver:self forKeyPath:@"viewModel.isRead" options:NSKeyValueObservingOptionNew context:nil];
// 添加KVOController 的 KVO
MJWeakSelf
[self.KVOController observe:self.viewModel keyPath:@"isRead" options:NSKeyValueObservingOptionNew block:^(id _Nullable observer, id _Nonnull object, NSDictionary<NSString *,id> * _Nonnull change) {
if (weakSelf.viewModel) {
if ([change[NSKeyValueChangeNewKey] intValue] == 0) {
weakSelf.wordLabel.textColor = color6;
weakSelf.spellLabel.textColor = color8;
} else {
weakSelf.wordLabel.textColor = color1;
weakSelf.spellLabel.textColor = color1;
}
}
}];
}
后續(xù)相關:血的教訓
上面的bug解決以后蓄喇,我在測試其他頁面的時候,有一個頁面交掏,進去以后pop出來就崩潰
周日加班妆偏,從早晨調(diào)試到凌晨,這個bug死活被找到原因
報的錯為
core::supernode::HttpDownloader(533)::[conf::query]Request ur
Enqueued from com.apple.main-thread
malloc: can't protect region for postlude guard page
后來想到文章開頭的僵尸對象設置盅弛,然后就把設置關閉了钱骂,發(fā)現(xiàn)就不再崩潰了。我了擦啊啊啊啊啊??????
關閉僵尸對象
Product --> Scheme --> Edit Scheme --> Diagnositics
還是用了上圖挪鹏,就不截圖的见秽,記住這5個箭頭指向的對勾都要關閉
記住調(diào)試完成以后,一定要把這5個箭頭指向的對勾都要關掉
記住調(diào)試完成以后讨盒,一定要把這5個箭頭指向的對勾都要關掉
記住調(diào)試完成以后解取,一定要把這5個箭頭指向的對勾都要關掉