iOS開發(fā)中需要大量對dictionary和array進行操作,因此我們需要一種更加安全可靠的操作方法來避免不必要的crash帖旨。當(dāng)然可以通過自定義dictionary 和array重載增刪改查的方法來避免crash,但是由于許多工程基本成型以后灵妨,如此操作的話工作量解阅,改動等都會很大。此時我們可以利用OC語言動態(tài)特性對數(shù)組和字典的增刪改查方法進行Method Swizzling(不懂得自行百度吧) 泌霍,替換成我們經(jīng)過安全操作的方法货抄,從而進行安全操作。當(dāng)然有好多大神已經(jīng)實現(xiàn)過了朱转,但是畢竟會用并不代表是自己的蟹地。好了廢話不多說吧,下面我們就開始自己動手一步步實現(xiàn)我們自己的safe類吧藤为。
一. 首先第一步我們需要知道字典和素組進行操作(也支持字面量操作)崩潰的原因有哪些:
-
不可變數(shù)組NSArray 常用的方法有
objectAtIndex
objectAtIndexedSubscript
arrayByAddingObject
arrayWithObject
主要的crash reason是數(shù)組越界怪与,運行一下代碼
代碼1
程序崩潰 看下日志reason: '*** -[__NSArrayI objectAtIndex:]: index 3 beyond bounds [0 .. 2]
運行下面代碼 數(shù)組中追加了一個nil值
代碼2程序崩潰日志
reason: '*** -[NSArray arrayByAddingObject:]: object cannot be nil'
運行代碼
NSArray * testArray = [NSArray arrayWithObject:nil];
崩潰日志reason: '*** -[__NSPlaceholderArray initWithObjects:count:]: attempt to insert nil object from objects[0]
可變數(shù)組常用方法 增刪改查等 主要有
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在實現(xiàn)load方法( + load 方法,那么當(dāng)類被加載時它會自動被調(diào)用)時將這些方法進行hook凉蜂,注意方法進行Swizzling時候程序生命周期內(nèi)只需要執(zhí)行一次:
對NSArray舉例實現(xiàn)一下
1\.新建NSArray的categary NSArray+Safe
當(dāng)數(shù)組越界時 crash reason[__NSArrayI objectAtIndex:]: index 3 beyond bounds [0 .. 2]
我們需要使用函數(shù)method_exchangeImplementations(method1,method2)
交換兩個方法的實現(xiàn)指針 因為交換指針需要多次使用琼梆,我們對此方法進行封裝
如下圖:

實現(xiàn)一下load函數(shù)
如下圖

實現(xiàn)我們自定義的方法
如下圖

ok性誉,數(shù)組越界已經(jīng)解決了窿吩!可以試一下啦!
其他的都是大同小異错览,下面是我的github地址纫雁,將庫拖到工程里邊就可以啦!
博客地址