數組越界其實是很基本的問題,但是解決起來除了count的判斷,還有每個調用的時候都要去判斷一遍
對於不明確的數據總會有崩潰的風險
然而 每次調用都判斷 那是太累了
so 。。runtime&category提供了一個比較簡潔的解決方案
首先把NSArray/NSMutableArray的objectAtIndex方法通過objc的runtime 里面method swizzle把方法進行替換
+ (void)load{ [super load]; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ //方法交換只要一次就好 Method oldObjectAtIndex = class_getInstanceMethod(objc_getClass("__NSArrayI"), @selector(objectAtIndex:)); Method newObjectAtIndex = class_getInstanceMethod(objc_getClass("__NSArrayI"), @selector(__nickyTsui__objectAtIndex:)); method_exchangeImplementations(oldObjectAtIndex, newObjectAtIndex); }); }
可以看到 舊方法跟新方法的名字(在上面兩個selector里面)
接着寫上新方法即可
在新方法里面做越界判斷
- (id)__nickyTsui__objectAtIndex:(NSUInteger)index{ if (index > self.count - 1 || !self.count){ @try { return [self __nickyTsui__objectAtIndex:index]; } @catch (NSException *exception) { //__throwOutException 拋出異常 return nil; } @finally { } } else{ return [self __nickyTsui__objectAtIndex:index]; } }
把這個NSArray的category加到pch就好了。。
demo
http://files.cnblogs.com/files/n1ckyxu/ArrayBoundsDemo.zip
請注意! 最近發現的一個小問題,對NSArray hook后會產生系統鍵盤會被ARC釋放掉從而產生zombie memory,導致閃退的問題
具體情況: iOS8下 隨機激活一個textfield/textview 鍵盤出現后,按home鍵使app進入后台,app隨即閃退
解決方案:在工程配置中 設置這個NSArray的Category的.m文件使用mrc運行, 配置加上 -fno-objc-arc