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

假死,就是 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");
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lucy-JY

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值