1.起因
最近接手了一個項目, 某功能完成了一半, 我接著開發(fā)那種. 然后遇到了上面的bug. 有點累, 就不賣關子啦, 直接說吧. 全局斷點是get不到這個崩潰的, 但是我們看log, 提示是"字典類型調用了objectindex:方法". 我們知道字典類型nsdictionary是沒有這個objectinde:方法的, 所以順著這個思路去找吧.........藍鵝, 原項目代碼超級多, 而且別人的風格也不熟悉, 找啊找啊, 各種搜, 最后花了小半天時間老眼昏花才找到了. 出于保密原因, 原項目代碼是不能貼出來的. 這里我模擬了上面的崩潰供大家參考.
崩潰的截圖
2. 代碼
- (void)viewDidLoad {
[super viewDidLoad];
self.arr01 = [NSMutableArray array];
for (int i = 0; i < 10; i++) {
NSDictionary *dic = @{
@"valueInt" : [NSString stringWithFormat:@"%d", i]
};
[self.arr01 addObject:dic];
}
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
NSArray *tempArr = self.arr01[5];
[tempArr objectAtIndex:2];
}
為了更直觀, 這里貼個截圖:
3. 原因分析
主要原因在上面的截圖已經(jīng)說了, 這里說的主要是OC語言的特性, 這個崩潰在編譯的時候并沒有報錯, 因為在第二部分里面調用objectindex方法的是tempArr, 編譯階段是正確的. 但是, OC是個運行時語言, 在跑起來的時候, 實際上從self.arr01取出來的卻是nsdictionary類型的對象, 所以就崩潰了.