Foundation框架防奔溃

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

框架支持拦截Crash的类有:

  • NSArray
  • NSMutableArray
  • NSDictionary
  • NSMutableDictionary
  • NSStirng
  • NSMutableString
  • NSAttributedString
  • NSMutableAttributedString
  • NSSet
  • NSMutableSet
  • NSData
  • NSMutableData
  • NSOrderedSet
  • NSMutableOrderedSet
  • KVO
  • NSNotificationCenter
  • NSUserDefaults
  • NSCache
  • NSNull
  • UncaughtException(系统内核层Signal捕获的异常)

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

  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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 《吹牛大王历险记》 本书作者之一拉斯培,学识渊博、才智过人、生性活泼。因向英国人介绍德国浪漫主义诗篇,他于1788...
    丹菡阅读 913评论 0 3
  • 1705年,大清王朝已入主中原多年,年富力强的康熙皇帝执掌国家最高权力已然四十四个年头。历经剪除三藩(1673)、...
    寒夷术阅读 1,213评论 1 3
  • 表达愤怒的四个步骤 籍:非暴力沟通 作者:马歇尔·卢森堡博士 介绍: 著名的马歇尔·卢森堡博士发现了一种沟通方式,...
    xindong_ying阅读 5,274评论 0 0
  • 只有当一个人独处的时候,她才可以完全成为自己。热爱独处,等同热爱自由。 一、独处,可以摆脱外界虚名浮利的诱惑 太多...
    RT子萱阅读 337评论 0 0