我們先來看看有可能會出現的陣列越界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)把之前的** welfareitem *item = [_datasourcearray objectatindex:indexpath.row] 改為 welfareitem *item = [_datasourcearray objectatindexcheck:indexpath.row] 在上面。因此,有可能解決陣列邊界 -[__nsarrayi objectatindex:]: index 100 beyond bounds [0 .. 1]' 錯誤/*! @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
iOS 陣列越界處理方法總結
所謂的陣列越界,就是假如你的下標總數現在為32個,然後你在下一秒又執行了乙個方法要從50個資料裡進行賦值,篩選之類的 而你此時數量為32 50的資料還沒有請求到 往往會出現陣列越界的崩潰資訊 具體的解決方式我們通常會選擇把陣列做個判斷列如 return nil 雖然在大多數情況下是可以的,但是多少並...
iOS中防止陣列越界之後發生崩潰
在ios開發中有時會遇到陣列越界的問題,從而導致程式崩潰。為了防止程式崩潰,我們就要對陣列越界進行處理。通過上網查資料,發現可以通過為陣列寫乙個分類來解決此問題。基本思路 為nsarray寫乙個防止陣列越界的分類。分類中利用runtime將系統中nsarray的物件方法objectatindex 替...
ios 針對陣列越界的崩潰優化
陣列越界是常見的崩潰 崩潰日記是類似這樣的 網上也找過怎麼解決,但是都不是太徹底,由於 nsarray是乙個類簇,需要把所有的入口都封住才算完美 方法還是很常見的,用了runtime的方法替換 然後 給nsarray加類別 部分核心 implementation nsarray safeindex ...