在進行app開發過程中會遇到很多的問題,各種崩潰令人相當頭疼。當然,解決bug的能力也體現了一個程序員的水平,現在來說一說開發中經常遇到的崩潰問題吧。
常見崩潰問題: 一是signal SIGABRT, 二是EXC_BAD_ACCESS.
一、signal SIGABRT 出現這樣的崩潰一般有兩個原因:1. 數組越界
輸入:
NSArray *array = [NSArray arrayWithObject:@"0"]; NSString *str = [array objectAtIndex:1]; NSLog(@"%@",str);
運行崩潰:
打印的崩潰信息:
Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayI objectAtIndex:]: index 1 beyond bounds [0 .. 0]',很明顯給出的崩潰信息是數組越界,此時要仔細檢查程序中的數組問題
2.調用的方法不存在:
輸入:
[self performSelector:@selector(haha)];
運行崩潰,崩潰信息:
unrecognized selector sent to instance 0x7fcd584a1ae0
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[ViewController haha]: unrecognized selector sent to instance 0x7fcd584a1ae0'
說明該方法並不存在,所以造成崩潰
二、EXC_BAD_ACCESS一般是內存訪問出錯,對象內存已經釋放,但仍然在訪問會造成這樣的后果
舉個例子,在進行視頻截圖時,
generator是圖片資源生成器 [generator generateCGImagesAsynchronouslyForTimes:@[currentSnipTime] completionHandler:^(CMTime requestedTime, CGImageRef _Nullable image, CMTime actualTime, AVAssetImageGeneratorResult result, NSError * _Nullable error) { NSLog(@"生成完成"); //主線程更新UI 如果是異步任務 : 在當前線程中繼續執行,而不會等待該代碼塊執行完畢,也就是跳過了賦值的代碼,造成野指針 dispatch_sync(dispatch_get_main_queue(), ^{ //EXC_BAD_ACCESS 野指針 訪問不能使用的內存地址 self.snipImageView.image = [UIImage imageWithCGImage:image]; }); }];
所以當崩潰信息中出現了EXC_BAD_ACCESS這樣的信息,可以分析哪些屬性用weak修飾,或者線程異步/同步問題。當然我們還可以借助Xcode工具 點擊Xcode的菜單:Product->Profile,啟動Instruments 在Instruments模板中選擇Zombies,它能把已釋放的內存暫時保留,再次訪問時會報告錯誤,並給出該塊內存曾經的一些使用信息,幫助我們快速定位。