iOS 数组字典safe拓展 避免crash崩溃

iOS开发中需要大量对dictionary和array进行操作,因此我们需要一种更加安全可靠的操作方法来避免不必要的crash。

一. 首先第一步我们需要知道字典和素组进行操作(也支持字面量操作)崩溃的原因有哪些:

不可变数组NSArray 常用的方法有 objectAtIndex objectAtIndexedSubscript arrayByAddingObject arrayWithObject
主要的crash reason是数组越界,运行一下代码

程序崩溃 看下日志reason: '*** -[__NSArrayI objectAtIndex:]: index 3 beyond bounds [0 .. 2]

运行下面代码 数组中追加了一个nil值


程序崩溃日志reason: '*** -[NSArray arrayByAddingObject:]: object cannot be nil'

运行代码NSArray * testArray = [NSArray arrayWithObject:nil];
崩溃日志reason: '*** -[__NSPlaceholderArray initWithObjects:count:]: attempt to insert nil object from objects[0]

可变数组常用方法 增删改查等 主要有1.[__NSPlaceholderArray initWithObjects:count:] 2.[__NSArrayM insertObject:atIndex:] 3.[__NSArrayM objectAtIndex:] 4.[__NSArrayM removeObjectAtIndex:] 5.[__NSArrayM replaceObjectAtIndex:withObject:] 6.[NSMutableArray replaceObjectsInRange:withObjectsFromArray:]

不可变字典 初始化有空值 [__NSPlaceholderDictionary initWithObjects:forKeys:count:]

可变字典常用方法setObject: forKey:
removeObjectsForKeys:
removeObjectForKey:
进行操作是key value 不能为nil

二. 第二步我们利用runtime在实现load方法( + load 方法,那么当类被加载时它会自动被调用)时将这些方法进行hook,注意方法进行Swizzling时候程序生命周期内只需要执行一次:
对NSArray举例实现一下1.新建NSArray的categary NSArray+Safe当数组越界时 crash reason[__NSArrayI objectAtIndex:]: index 3 beyond bounds [0 .. 2]
我们需要使用函数method_exchangeImplementations(method1,method2)
交换两个方法的实现指针 因为交换指针需要多次使用,我们对此方法进行封装如下图:

实现一下load函数如下图

实现我们自定义的方法如下图

ok,数组越界已经解决了!可以试一下啦!

其他的都是大同小异,下面是我的github地址,将库拖到工程里边就可以啦!博客地址

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

推荐阅读更多精彩内容