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
method_exchangeImplementations(oldObjectAtIndex, newObjectAtIndex);
// 替換可變陣列中的方法
Method oldMutableObjectAtIndex =class_getInstanceMethod(objc_getClass("__NSArrayM"),@selector(objectAtIndex:));
Method newMutableObjectAtIndex = class_getInstanceMethod
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]這種情況下產生的崩潰也能防止。