Objective-c防止數組越界而崩潰(全局效果)


數組越界其實是很基本的問題,但是解決起來除了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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM