美文网首页
Foundation框架防奔溃

Foundation框架防奔溃

作者: Geniune | 来源:发表于2019-01-10 11:08 被阅读4次

源码:https://github.com/Geniune/SafeProtector
用法:将三个文件夹拖入工程即可,无需import任何头文件

基本很多奔溃都出在下面几个问题上:

  1. 数组越界、空指针
  2. 字典空指针
  3. 服务器和原生本地字段数据类型不匹配
  4. 调用UIButton setTitle:或UILabel setText:时,使用非NSString类型对象赋值等

由于OC动态运行时语言的特性在不做容错的情况下,开发者有时也很难确保对象类型是否与预期的一致,也很容易导致奔溃现象发生

例如解决”数组越界“这个问题,思路如下:

分析数组取值的方法,有下面两种:

  1. [array objectAtIndex:10] (objectAtIndex:)
  2. array[10](objectAtIndexedSubscript:)

创建NSArray分类(Category),在+load函数中重指向两个取值方法,注意使用dispatch_once保证线程安全且只执行一次

+ (void)load
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        [self exchangeInstance:objc_getClass("__NSArrayI") selector:@selector(objectAtIndex:)withSwizzledSelector:@selector(safe_objectAtIndexI:)];
        [self exchangeInstance:objc_getClass("__NSArrayI") selector:@selector(objectAtIndexedSubscript:) withSwizzledSelector:@selector(safe_objectAtIndexedSubscriptI:)];
    });
}

然后再实现重定向的方法函数:

- (instancetype)safe_objectAtIndexI:(NSUInteger)index
{
    id object = nil;
    @try {
        object = [self safe_objectAtIndexI:index];
    } @catch (NSException *exception) {
        LSSafeProtectionCrashLog(exception,LSSafeProtectorCrashTypeNSArray);
    } @finally {
        return object;
    }
}

- (instancetype)safe_objectAtIndexedSubscriptI:(NSUInteger)index
{
    id object = nil;
    @try {
        object = [self safe_objectAtIndexedSubscriptI:index];
    } @catch (NSException *exception) {
        LSSafeProtectionCrashLog(exception,LSSafeProtectorCrashTypeNSArray);
    } @finally {
        return object;
    }
}

@end

只要保证工程中包含该NSArray分类即可(无需import),使用如下:

NSArray *array = @[@"Tom", @"John", @"Merry"];
[array objectAtIndex:4];

这时程序不会直接奔溃,控制台报错如下:


图片.png

其他NSMutableArray和NSDictionary的容错实现类似,这里不逐个赘述。

想重新放开让程序直接奔溃只需将NSObject+SafeProtector.m中47行中的assert();方法注释回来即可

(注意在上架前检查或根据debug/release做判断)

如果本文对你有所帮助记得点个喜欢哈

相关文章

  • Foundation框架防奔溃

    源码:https://github.com/Geniune/SafeProtector用法:将三个文件夹拖入工程即...

  • 日常防奔溃技巧

    1.对数据做转型: String.toXXXOrInt() 使用场景:当数据实际类型不确定,并且符合某种条件需要转...

  • DYLD, Library not loaded: /usr/l

    奔溃日志 奔溃表现:iOS12.1 及以下启动奔溃奔溃日志: 解决方法:关闭bitcode,重新打包上传appst...

  • 20170602基础知识-语法基础、运算符

    1、import引入框架, Foundation框架是基础框架 macOS框架:Foundation、AppKit...

  • iOS-千奇百怪的奔溃

    App 上线后,我们最怕的应该就是异常奔溃了。常见的奔溃类型分两种:信号可捕获奔溃、信号不可捕获奔溃,前者比较典型...

  • 奔溃

    送表弟们去上学的路上,听说刚才忘了拿《斗罗大陆》,却又接着说可以向同学借。我的内心立即奔溃了,满满的无力感! 当初...

  • 奔溃

    我总是想不让自己在乎别人的眼光,所以我总是在街上很自在,不担心自己的丑态被别人看到,我也经常对女友这么说,不要在意...

  • 奔溃

    工作到奔溃 加班到晚上八九点 没有人会理解你的苦楚,下班回家星空相伴,人与人之间的关系脆弱到分崩离析,工作后发现身...

  • 奔溃

    为什么当知道这个结果,我却奔溃了?原来不被期待的事情却偏偏来了,心里是那样的抵触。

  • 奔溃

    这次我是真的奔溃。 不知是不是产后抑郁。看着自己肥胖体型、变形的胸部,还有爱哭闹的孩子、躺在沙发上玩手机的老公。我...

网友评论

      本文标题:Foundation框架防奔溃

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