1. 程式人生 > >iOS中防止陣列越界之後發生崩潰

iOS中防止陣列越界之後發生崩潰

在iOS開發中有時會遇到陣列越界的問題,從而導致程式崩潰。為了防止程式崩潰,我們就要對陣列越界進行處理。通過上網查資料,發現可以通過為陣列寫一個分類來解決此問題。

基本思路:為NSArray寫一個防止陣列越界的分類。分類中利用runtime將系統中NSArray的物件方法objectAtIndex:替換,然後對objectAtIndex:傳遞過來的下標進行判斷,如果發生陣列越界就返回nil,如果沒有發生越界,就繼續呼叫系統的objectAtIndex:方法

程式碼:

.h檔案:

#import <Foundation/Foundation.h>

#import <objc/runtime.h>

@interface NSArray (beyond)

@end


.m檔案:

#import "NSArray+beyond.h"

@implementation NSArray (beyond)

+ (void)load{

    [superload];

     //  替換不可變陣列中的方法

Method oldObjectAtIndex =class_getInstanceMethod(objc_getClass("__NSArrayI"),@selector(objectAtIndex:));

Method newObjectAtIndex =class_getInstanceMethod(objc_getClass

("__NSArrayI"),@selector(__nickyTsui__objectAtIndex:));

method_exchangeImplementations(oldObjectAtIndex, newObjectAtIndex);

    //  替換可變陣列中的方法

Method oldMutableObjectAtIndex =class_getInstanceMethod(objc_getClass("__NSArrayM"),@selector(objectAtIndex:));

Method newMutableObjectAtIndex = class_getInstanceMethod

(objc_getClass("__NSArrayM"),@selector(mutableObjectAtIndex:));

method_exchangeImplementations(oldMutableObjectAtIndex, newMutableObjectAtIndex);

}

- (id)__nickyTsui__objectAtIndex:(NSUInteger)index{

if (index >self.count -1 || !self.count){

@try {

return [self__nickyTsui__objectAtIndex:index];

        } @catch (NSException *exception) {

//__throwOutException  丟擲異常

NSLog(@"陣列越界...");

returnnil;

        } @finally {

        }

    }

else{

return [self__nickyTsui__objectAtIndex:index];

    }

}

- (id)mutableObjectAtIndex:(NSUInteger)index{

if (index >self.count -1 || !self.count){

@try {

return [selfmutableObjectAtIndex:index];

        } @catch (NSException *exception) {

//__throwOutException  丟擲異常

NSLog(@"陣列越界...");

returnnil;

        } @finally {

        }

    }

else{

return [selfmutableObjectAtIndex:index];

    }

}

@


2018.06.01更新:

這裡有一個防止陣列越界崩潰的升級版,即使arr[index]這種情況下產生的崩潰也能防止。