ios常見(jiàn)Crash

1.NSInvalidArgumentException 異常

出現(xiàn)這種異常的原因一般是在不可以出現(xiàn)nil數(shù)據(jù)的時(shí)候傳入了nil,比如在創(chuàng)建NSDictionary的時(shí)候值傳入了nil就會(huì)出現(xiàn)這種崩潰錯(cuò)誤,如果必須傳空需要把nil對(duì)象轉(zhuǎn)成NSNull才可以確保不出現(xiàn)這種錯(cuò)誤,有3種方案可以解決該問(wèn)題,如下:

方案一:后臺(tái)在返回?cái)?shù)據(jù)的時(shí)候進(jìn)行校驗(yàn)吭练,對(duì)空值進(jìn)行處理。但是在項(xiàng)目中有些空值是有特殊的用途,此種方案不可行饺窿。

方案二:在轉(zhuǎn)換成NSDictionary的時(shí)候,對(duì)后臺(tái)返回的數(shù)據(jù)進(jìn)行校驗(yàn)移斩,把空值轉(zhuǎn)換成NSNull對(duì)象肚医。方案可行,但是需要對(duì)現(xiàn)有代碼做大的改動(dòng)向瓷,每次轉(zhuǎn)換的時(shí)候都需要進(jìn)行校驗(yàn)肠套,太麻煩。業(yè)務(wù)高速發(fā)展時(shí)期猖任,這樣做成本太高你稚。

方案三:有沒(méi)有一種無(wú)須改動(dòng)現(xiàn)有代碼又能解決該問(wèn)題呢?答案是有的,可以利用Objective-C的runtime來(lái)解決該問(wèn)題入宦。

NSDictionary插入nil對(duì)象會(huì)造成崩潰哺徊,但是插入NSNull對(duì)象是不會(huì)造成崩潰的,只要利用runtime的Swizzle Method把nil對(duì)象給轉(zhuǎn)換成NSNull對(duì)象就可以把該問(wèn)題給解決了乾闰。創(chuàng)建一個(gè)NSDictionary的類(lèi)別落追,利用runtime的Swizzle Method來(lái)替換系統(tǒng)的方法。源碼實(shí)現(xiàn)可以參考Glow團(tuán)隊(duì)封裝的NSDictionary+NilSafe(Github上可下載到), 現(xiàn)截取其中的部分代碼如下:

+ (instancetype)gl_dictionaryWithObjects:(const id [])objects forKeys:(const id<NSCopying> [])keys count:(NSUInteger)cnt {
    id safeObjects[cnt];
    id safeKeys[cnt];
    NSUInteger j = 0;
    for (NSUInteger i = 0; i < cnt; i++) {
        id key = keys[i];
        id obj = objects[i];
        if (!key) {
            continue;
        }
        if (!obj) {
            obj = [NSNull null];
        }
        safeKeys[j] = key;
        safeObjects[j] = obj;
        j++;
    }
    return [self gl_dictionaryWithObjects:safeObjects forKeys:safeKeys count:j];
}

2.data parameter is nil

NSJSONSerialization序列化的時(shí)候涯肩,傳入data為nil轿钠,造成的崩潰,這個(gè)問(wèn)題比較好解決病苗,在序列化的時(shí)候疗垛,統(tǒng)一加入判斷,判斷data是不是nil即可硫朦。

3.unrecognized selector sent to instance 0x15d23910

造成這條崩潰的原因贷腕,想必大家都比較熟悉了,就是一個(gè)類(lèi)調(diào)用了一個(gè)不存在的方法咬展,造成的崩潰泽裳。解決這樣的問(wèn)題,可以在寫(xiě)一個(gè)方法的時(shí)候破婆,判斷一下其類(lèi)的類(lèi)型涮总,不符合類(lèi)型的不讓其調(diào)用

4.SIGSEGV 異常

當(dāng)去訪問(wèn)沒(méi)有被開(kāi)辟的內(nèi)存或者已經(jīng)被釋放的內(nèi)存時(shí),就會(huì)發(fā)生這樣的異常祷舀。另外瀑梗,在低內(nèi)存的時(shí)候,也可能會(huì)產(chǎn)生這樣的異常裳扯,一般開(kāi)發(fā)中用到C語(yǔ)言呢的時(shí)候比較容易出現(xiàn)這種錯(cuò)誤抛丽,因?yàn)锳RC并不會(huì)對(duì)C語(yǔ)言進(jìn)行內(nèi)存管理,所以用C語(yǔ)言創(chuàng)建的對(duì)象一定要手動(dòng)Free

5.Can't add self as subview crash

造成這個(gè)崩潰的原因嚎朽,一種原因是在push或pop一個(gè)視圖的時(shí)候铺纽,并且設(shè)置了animated:YES,如果此時(shí)動(dòng)畫(huà)(animated)還沒(méi)有完成哟忍,這個(gè)時(shí)候,你在去push或pop另外一個(gè)視圖的時(shí)候陷寝,就會(huì)造成該異常锅很。
解決該異常最簡(jiǎn)單的方式是把a(bǔ)nimated設(shè)置為NO,但是很不友好凤跑,把系統(tǒng)自帶的動(dòng)畫(huà)效果給去掉了爆安。另外一種友好的方式就是通過(guò)runtime來(lái)進(jìn)行實(shí)現(xiàn)了,通過(guò)安全的方式仔引,確保當(dāng)有控制器正在進(jìn)行入椚硬郑或出棧時(shí)褐奥,沒(méi)有其他入棧或出棧操作

6.NSRangeException 異常

越界異常翘簇,一般就是數(shù)組越界或者字符串截取越界

7.SIGPIPE 異常

先解釋一下什么是SIGPIPE異常撬码,通俗一點(diǎn)的描述是這樣的:對(duì)一個(gè)端已經(jīng)關(guān)閉的socket調(diào)用兩次write,第二次write將會(huì)產(chǎn)生SIGPIPE信號(hào)版保,該信號(hào)默認(rèn)結(jié)束進(jìn)程呜笑。

那如何解決該問(wèn)題呢?對(duì)SIGPIPE信號(hào)可以進(jìn)行捕獲彻犁,也可將其忽略叫胁,對(duì)于iOS系統(tǒng)來(lái)說(shuō),只需要把下面這段代碼放在.pch文件中即可汞幢。

// 僅在 IOS 系統(tǒng)上支持 SO_NOSIGPIPE
#if defined(SO_NOSIGPIPE) && !defined(MSG_NOSIGNAL)
    // We do not want SIGPIPE if writing to socket.
    const int value = 1;
    setsockopt(fd, SOL_SOCKET, SO_NOSIGPIPE, &value, sizeof(int));
#endif

8.SIGABRT 異常

這是一個(gè)讓程序終止的標(biāo)識(shí)驼鹅,會(huì)在斷言、app內(nèi)部森篷、操作系統(tǒng)用終止方法拋出输钩。通常發(fā)生在異步執(zhí)行系統(tǒng)方法的時(shí)候。如CoreData疾宏、NSUserDefaults等张足,還有一些其他的系統(tǒng)多線程操作。
注意:這并不一定意味著是系統(tǒng)代碼存在bug坎藐,代碼僅僅是成了無(wú)效狀態(tài)为牍,或者異常狀態(tài)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末岩馍,一起剝皮案震驚了整個(gè)濱河市碉咆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蛀恩,老刑警劉巖疫铜,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異双谆,居然都是意外死亡壳咕,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén)顽馋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)谓厘,“玉大人,你說(shuō)我怎么就攤上這事寸谜【刮龋” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)他爸。 經(jīng)常有香客問(wèn)我聂宾,道長(zhǎng),這世上最難降的妖魔是什么诊笤? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任系谐,我火速辦了婚禮,結(jié)果婚禮上盏混,老公的妹妹穿的比我還像新娘蔚鸥。我一直安慰自己,他們只是感情好许赃,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布止喷。 她就那樣靜靜地躺著,像睡著了一般混聊。 火紅的嫁衣襯著肌膚如雪弹谁。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,292評(píng)論 1 301
  • 那天句喜,我揣著相機(jī)與錄音预愤,去河邊找鬼。 笑死咳胃,一個(gè)胖子當(dāng)著我的面吹牛植康,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播展懈,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼销睁,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了存崖?” 一聲冷哼從身側(cè)響起冻记,我...
    開(kāi)封第一講書(shū)人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎来惧,沒(méi)想到半個(gè)月后冗栗,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡供搀,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年隅居,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片葛虐。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡军浆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出挡闰,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布摄悯,位于F島的核電站赞季,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏奢驯。R本人自食惡果不足惜申钩,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望瘪阁。 院中可真熱鬧撒遣,春花似錦、人聲如沸管跺。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)豁跑。三九已至廉涕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間艇拍,已是汗流浹背狐蜕。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留卸夕,地道東北人层释。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像快集,于是被迫代替她去往敵國(guó)和親贡羔。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 背景 眾所周知碍讨,對(duì)于移動(dòng)客戶端而言治力,crash對(duì)于用戶是一種非常糟糕的體驗(yàn),crash率對(duì)于一款移動(dòng)應(yīng)用而言也是一...
    東野浪子閱讀 7,332評(píng)論 2 8
  • 一勃黍、訪問(wèn)了一個(gè)已經(jīng)被釋放的對(duì)象 在不使用 ARC 的時(shí)候宵统,內(nèi)存要自己管理,這時(shí)重復(fù)或過(guò)早釋放都有可能導(dǎo)致 Cras...
    李華光閱讀 1,807評(píng)論 0 1
  • 在日常項(xiàng)目中覆获,常見(jiàn)的crash包括:給NSNull發(fā)送消息马澈,數(shù)組越界,字典傳空值等弄息。我們可以對(duì)這些crash簡(jiǎn)單的...
    oncezou閱讀 1,460評(píng)論 0 1
  • 一痊班、經(jīng)常遇到的bug 1:訪問(wèn)了一個(gè)已經(jīng)被釋放的對(duì)象(MRC環(huán)境中常見(jiàn)) obj這個(gè)對(duì)象已經(jīng)被釋放,但是指針沒(méi)有置...
    lbfly_boy閱讀 1,183評(píng)論 0 1
  • 代碼下載 iOS Crash 殺手排名 殺手 NO.1 NSInvalidArgumentException 異常...
    雷鳴1010閱讀 2,478評(píng)論 1 3