美文网首页iOS-每天进步一点点iOS Developer
iOS 开发中出现假死解决思路

iOS 开发中出现假死解决思路

作者: DDDDeveloper | 来源:发表于2017-06-30 09:27 被阅读265次

假死,就是 APP 没有响应,点击界面任何地方都不会有响应,但是又不会闪退的一种现象。结合网上的一些资料和开发经验总结一下常见的原因:

1.一个透明的视图盖在了整个界面上

在做弹出框,或者遮盖的时候,不要将视图添加到下面的窗口上

[UIApplication sharedApplication].windows.lastObject

最后一个 window 不一定是你当前显示的 window。请看下面的运行结果

[
    <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上,就会出现假死,而你查看视图层级关系是不会发现的。
最好的办法是拿到代理的窗口,把你想要的遮盖加到上面。

UIWindow *window = [UIApplication sharedApplication].delegate.window;

    [window addSubview:view];

这只是其中一个例子,仅供参考。

2.死循环

如果不小心写了一个死循环,也会造成假死。可以查看 CPU 使用率。如果达到99%或者100%,说明肯定有死循环了。举个例子,当你写一个懒加载的属性时,不小心写成下面这样,那么就惨了!

- (NSMutableArray *)selectSignal {
    if (!_selectSignal) {

        _selectSignal = [NSMutableArray array];
    }
    return self.selectSignal;
}

3.线程问题

当执行了一个比较耗时的方法,而这个方法恰好在主线程,不严重的话就是卡顿,严重一点就出现了假死现象。
还有就是考虑有没有出现死锁,或者是否在子线程中做了 UI 相关的操作。

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSLog(@"=================4");
    dispatch_sync(dispatch_get_main_queue(), ^{
        NSLog(@"=================5");
    });
    NSLog(@"=================6");
}

读者朋友如果遇到过其他奇葩原因,欢迎交流。

相关文章

网友评论

    本文标题:iOS 开发中出现假死解决思路

    本文链接:https://www.haomeiwen.com/subject/exjbcxtx.html