iOS崩潰——#47685 SIGSEGV SEGV_ACCERR

解決方案

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;

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容