美文网首页
iOS 常见崩溃类型

iOS 常见崩溃类型

作者: 小暖风 | 来源:发表于2019-11-07 13:32 被阅读0次

1.UIKit Called on Non-Main Thread,非主线程刷新UI

通过runtime的方法替换,替换UIView 的 setNeedsLayout, layoutIfNeeded,layoutSubviews, setNeedsUpdateConstraints。方法,判断当前线程是否为主线程,如果不是,在主线程执行。

例如:

- (void)wt_safe_setNeedsLayout

{

    if(![NSThread isMainThread]){

        dispatch_async(dispatch_get_main_queue(), ^{

            NSAssert(false, @"wt_safe_setNeedsLayout failed");

            [self wt_safe_setNeedsLayout];

        });

    }else{

        [self wt_safe_setNeedsLayout];

    }

}

2.KVO

项目中KVO crash 占比很高, 主要原因为,添加删除不对称导致。

解决方法为,添加Map进行缓存。

所以我在addObserver:forKeyPath:options:context:这个方法里新建了一个字典,用来记录observer和keyPath。

下面需要解决的就是什么时候去调用的问题,我首先想到的是在dealloc时去判断是否添加了KVO的监视,但是当我直接交换了dealloc方法后发现,这个方法调用的太多了,并不适合直接交换,不然整个程序都会卡顿起来,需要找一个时机,于是我又修改为在添加监视的时候去交换dealloc,这次成功了,这样可以减少对不必要的类进行方法交换,同时提高效率。

唯一需要注意的是在ARC的情况下,不能直接@selector(dealloc)来做方法交换,需要变形一下NSSelectorFromString(@"dealloc"),这样才能做方法交换。

3.容器越界(NSArray, NSDictionary,…)

这个问题,就是运用方法替换进行,目前对以下类进行防范,类中可能导致crash 的方法,逐步进行增量扩充。

NSArray

NSMutableArray

NSAttributedString

NSDictionary

NSFileManager

NSIndexPath

NSJSONSerialization

NSMutableAttributedString

NSMutableDictionary

NSMutableSet

NSMutableString

NSSet

NSString

NSURL

4.nil值问题

方法替换,对于Nil不添加,不处理。

5.unrecognized selector crash (这个很多时候是由于class使用错误导致)

方法替换,对于unrecognized selector,执行一个空方法。

[NSObject jr_swizzleMethod:@selector(forwardingTargetForSelector:) withMethod:@selector(WT_safeForwardingTargetForSelector:) error:&error];

    - (id)WT_safeForwardingTargetForSelector:(SEL)aSelector

{

    NSMethodSignature *signature = [self methodSignatureForSelector:aSelector];

    if ([self respondsToSelector:aSelector] || signature) {

        return [self WT_safeForwardingTargetForSelector:aSelector];

    }

    return [WTSafeGuard createFakeForwardTargetObject:self selector:aSelector];

}

相关文章

  • iOS 常见崩溃类型

    1.UIKit Called on Non-Main Thread,非主线程刷新UI 通过runtime的方法替换...

  • Runtime之常见崩溃问题

    一、iOS常见的崩溃类型 unrecognized selector sent to instance 调用了不存...

  • IOS开发中常见的崩溃类型

    1.调用悬浮指针 2.数组越界访问 3.调用了未实现的方法 4.调用的库函数版本高于本机 5.返回空cell 6....

  • iOS崩溃信息总结

    iOS崩溃信息总结 崩溃类型 Bad Memory Access [EXC_BAD_ACCESS // SIGSE...

  • iOS常见崩溃

    数组越界 1.数组中取值时越界 2.往数组中添加nil 野指针 出现野指针的情况 1.用assign修饰一个OC对...

  • iOS崩溃类型

    奔溃类型:·Mach kernel exceptions //内核异常· Fatal signals //信号 ...

  • iOS 避免常见崩溃(二)

    级别: ★★☆☆☆标签:「iOS 」「避免常见崩溃」「FBKVOController」「KVO」作者: WYW审...

  • iOS防崩溃

    2022-03-15 iOS OC常见崩溃和防止崩溃方案[https://www.jianshu.com/p/a7...

  • iOS 知识点归纳-一些点

    1 崩溃处理 iOS开发中碰到的几种常见的崩溃方式 - 简书[https://www.jianshu.com/p/...

  • iOS常见的崩溃

    数组越界 字面量数组和字典插入nil值 字典 Unrecognized Selector NaN崩溃 富文本初始化...

网友评论

      本文标题:iOS 常见崩溃类型

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