解決方案
SIG 是信號名的通用前綴, SEGV 是 segmentation violation 的縮寫
在 POSIX 兼容的平臺上,SIGSEGV 是當一個進程執(zhí)行了一個無效的內(nèi)存引用,或發(fā)生段錯誤時發(fā)送給它的信號。SIGSEGV 的符號常量在頭文件 signal.h 中定義。因為在不同平臺上,信號數(shù)字可能變化,因此符號信號名被使用。通常,它是信號11。
對于不正確的內(nèi)存處理,如當程序企圖訪問 CPU 無法定址的內(nèi)存區(qū)塊時,計算機程序可能拋出 SIGSEGV。操作系統(tǒng)可能使用信號棧向一個處于自然狀態(tài)的應(yīng)用程序通告錯誤,由此,開發(fā)者可以使用它來調(diào)試程序或處理錯誤。
在一個程序接收到 SIGSEGV 時的默認動作是異常終止。這個動作也許會結(jié)束進程,但是可能生成一個核心文件以幫助調(diào)試,或者執(zhí)行一些其他特定于某些平臺的動作。
SIGSEGV可以被捕獲。也就是說,應(yīng)用程序可以請求它們想要的動作,以替代默認發(fā)生的動作。這樣的動作可以是忽略它、調(diào)用一個函數(shù),或恢復(fù)默認的動作。在一些情形下,忽略 SIGSEGV 導(dǎo)致未定義行為。
一個應(yīng)用程序可能處理SIGSEGV的例子是調(diào)試器,它可能檢查信號棧并通知開發(fā)者目前所發(fā)生的,以及程序終止的位置。
SIGSEGV通常由操作系統(tǒng)生成,但是有適當權(quán)限的用戶可以在需要時使用kill系統(tǒng)調(diào)用或kill命令(一個用戶級程序,或者一個shell內(nèi)建命令)來向一個進程發(fā)送信號。
閃退場景一:
recorder deleteRecording 之前 先判斷文件是否存在,否則會造成過度釋放,解決方法:
if ([[NSFileManager defaultManager] fileExistsAtPath:self.recorder.url.path]) {
if (![self.recorder deleteRecording])
NSLog(@"Failed to delete %@", self.recorder.url);
}
閃退場景二: delegate = nil 。
將XXViewContrller設(shè)置為delegate時,當頁面發(fā)生跳轉(zhuǎn)時,XXViewController的對象會被釋放,這是代碼走到[_delegate callbackMethod],便出現(xiàn)crash。
解決方法有二:
1.將@property (nonatomic ,assign) id <BLELibDelegate>delegate; 中 assign關(guān)鍵字改為weak。
2.在XXViewController的delloc方法中添加:xxx.delegate = nil;