假死篱瞎,就是 APP 沒有響應(yīng)蚊夫,點(diǎn)擊界面任何地方都不會(huì)有響應(yīng)摊鸡,但是又不會(huì)閃退的一種現(xiàn)象谴餐。結(jié)合網(wǎng)上的一些資料和開發(fā)經(jīng)驗(yàn)總結(jié)一下常見的原因:
1.一個(gè)透明的視圖蓋在了整個(gè)界面上
在做彈出框渗饮,或者遮蓋的時(shí)候但汞,不要將視圖添加到下面的窗口上
[UIApplication sharedApplication].windows.lastObject
最后一個(gè) window 不一定是你當(dāng)前顯示的 window。請(qǐng)看下面的運(yùn)行結(jié)果
[
<UIWindow: 0x13fe11d10; frame = (0 0; 414 736); gestureRecognizers = <NSArray: 0x1702441d0>; layer = <UIWindowLayer: 0x17003a4a0>>,
<UITextEffectsWindow: 0x13fd7ae00; frame = (0 0; 414 736); opaque = NO; autoresize = W+H; layer = <UIWindowLayer: 0x174222460>>,
<UITextEffectsWindow: 0x141b66f70; frame = (0 0; 414 736); layer = <UIWindowLayer: 0x174a27640>>,
<UIRemoteKeyboardWindow: 0x141b68930; frame = (0 0; 414 736); opaque = NO; autoresize = W+H; layer = <UIWindowLayer: 0x174a27e40>>
]
如果你把視圖添加到UIRemoteKeyboardWindow
上互站,就會(huì)出現(xiàn)假死私蕾,而你查看視圖層級(jí)關(guān)系是不會(huì)發(fā)現(xiàn)的。
最好的辦法是拿到代理的窗口胡桃,把你想要的遮蓋加到上面踩叭。
UIWindow *window = [UIApplication sharedApplication].delegate.window;
[window addSubview:view];
這只是其中一個(gè)例子,僅供參考。
2.死循環(huán)
如果不小心寫了一個(gè)死循環(huán)容贝,也會(huì)造成假死自脯。可以查看 CPU 使用率斤富。如果達(dá)到99%或者100%膏潮,說明肯定有死循環(huán)了。舉個(gè)例子满力,當(dāng)你寫一個(gè)懶加載的屬性時(shí)焕参,不小心寫成下面這樣,那么就慘了油额!
- (NSMutableArray *)selectSignal {
if (!_selectSignal) {
_selectSignal = [NSMutableArray array];
}
return self.selectSignal;
}
3.線程問題
當(dāng)執(zhí)行了一個(gè)比較耗時(shí)的方法叠纷,而這個(gè)方法恰好在主線程,不嚴(yán)重的話就是卡頓悔耘,嚴(yán)重一點(diǎn)就出現(xiàn)了假死現(xiàn)象讲岁。
還有就是考慮有沒有出現(xiàn)死鎖,或者是否在子線程中做了 UI 相關(guān)的操作衬以。
- (void)viewDidLoad
{
[super viewDidLoad];
NSLog(@"=================4");
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"=================5");
});
NSLog(@"=================6");
}
讀者朋友如果遇到過其他奇葩原因缓艳,歡迎交流。