iOS 陣列越界 Crash加工經驗

2021-09-07 04:18:22 字數 3323 閱讀 7280

我們先來看看有可能會出現的陣列越界crash的地方。

- (void)tableview:(uitableview *)tableview didselectrowatindexpath:(nsindexpath *)indexpath 

- (uitableviewcell *)tableview:(uitableview *)tableview cellforrowatindexpath:(nsindexpath *)indexpath

- (void)tableview:(uitableview *)tableview didselectrowatindexpath:(nsindexpath *)indexpath 

}- (uitableviewcell *)tableview:(uitableview *)tableview cellforrowatindexpath:(nsindexpath *)indexpath

}

問題又來了,不管你武功有多高。有時也會忘記加。所以我們要想一招制敵辦法。我是想到了用runtime把objectatindex方法替換一下。**例如以下:

/*!

@category

@abstract nsobject的category

*/@inte***ce nsobject (util)

/*!@method swizzlemethod:withmethod:error:

@abstract 對例項方法進行替換

@param oldselector 想要替換的方法

@param newselector 實際替換為的方法

@param error 替換過程中出現的錯誤,假設沒有錯誤為nil

*/+ (bool)swizzlemethod:(sel)originalselector withmethod:(sel)swizzledselector error:(nserror **)error;

@end

#import "nsobject+util.h"

#import @implementation nsobject (util)

+ (bool)swizzlemethod:(sel)originalselector withmethod:(sel)swizzledselector error:(nserror **)error

method swizzledmethod = class_getinstancemethod(self, swizzledselector);

if (!swizzledmethod)

if (class_addmethod(self, originalselector, method_getimplementation(swizzledmethod), method_gettypeencoding(swizzledmethod)))

else

return yes;

}@end

@implementation nsarray (errermanager)

+ (void)load

; });

}- (id)swizzleobjectatindex:(nsuinteger)index

nslog(@"%@ 越界",self);

return nil;//越界返回為nil

}@end

有了上面**我們用 [_datasourcearray objectatindex:indexpath.row] 就不會發生越界crash了。越界

1 tbreader 0x002b93e9 tbreader + 2098153

2 libsystem_platform.dylib 0x33a66873 _sigtramp + 34

3 libsystem_blocks.dylib 0x33941ae1 _block_release + 216

4 libobjc.a.dylib 0x333c11a9 + 404

5 corefoundation 0x25ba23a9 _cfautoreleasepoolpop + 16

6 uikit 0x2912317f + 42

7 corefoundation 0x25c565cd + 20

8 corefoundation 0x25c53c8b + 278

9 corefoundation 0x25c54093 + 914

10 corefoundation 0x25ba2621 cfrunlooprunspecific + 476

11 corefoundation 0x25ba2433 cfrunloopruninmode + 106

12 graphicsservices 0x2cf0a0a9 gseventrunmodal + 136

都是這個crash。出如今ios7以上(含ios7),關鍵還沒實使用者反饋有問題,crash高了幾倍沒有乙個使用者反饋這樣的情況還是少見的,大家測試還復現不了;測試了一周最終復現了一樣的crash;是這樣出現的。替換了objectatindex方法有輸入的地方出來了軟鍵盤按手機home鍵就crash了;此法不行僅僅,僅僅能另尋他策了。

後來我們就給陣列新增擴充套件方法**例如以下

@inte***ce nsarray (shyutil)

/*! @method objectatindexcheck:

@abstract 檢查是否越界和nsnull假設是返回nil

@result 返回物件

*/- (id)objectatindexcheck:(nsuinteger)index;

@end

#import "nsarray+shyutil.h"

@implementation nsarray (shyutil)

- (id)objectatindexcheck:(nsuinteger)index

id value = [self objectatindex:index];

if (value == [nsnull null])

return value;

}@end

把之前的** welfareitem *item = [_datasourcearray objectatindex:indexpath.row] 改為 welfareitem *item = [_datasourcearray objectatindexcheck:indexpath.row] 在上面。因此,有可能解決陣列邊界 -[__nsarrayi objectatindex:]: index 100 beyond bounds [0 .. 1]' 錯誤

iOS 陣列越界處理方法總結

所謂的陣列越界,就是假如你的下標總數現在為32個,然後你在下一秒又執行了乙個方法要從50個資料裡進行賦值,篩選之類的 而你此時數量為32 50的資料還沒有請求到 往往會出現陣列越界的崩潰資訊 具體的解決方式我們通常會選擇把陣列做個判斷列如 return nil 雖然在大多數情況下是可以的,但是多少並...

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

在ios開發中有時會遇到陣列越界的問題,從而導致程式崩潰。為了防止程式崩潰,我們就要對陣列越界進行處理。通過上網查資料,發現可以通過為陣列寫乙個分類來解決此問題。基本思路 為nsarray寫乙個防止陣列越界的分類。分類中利用runtime將系統中nsarray的物件方法objectatindex 替...

ios 針對陣列越界的崩潰優化

陣列越界是常見的崩潰 崩潰日記是類似這樣的 網上也找過怎麼解決,但是都不是太徹底,由於 nsarray是乙個類簇,需要把所有的入口都封住才算完美 方法還是很常見的,用了runtime的方法替換 然後 給nsarray加類別 部分核心 implementation nsarray safeindex ...