1) 使用 signal(SIGPIPE, SIG_IGN) 忽略SIGPIPE。經(jīng)實驗在ios7模擬器上雖然xcode還是會捕獲SIGPIPE,但是程序不會崩潰,繼續(xù)后可以執(zhí)行。但是在真機上依然會崩潰。
讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價值的長期合作伙伴,公司提供的服務(wù)項目有:主機域名、虛擬主機、營銷軟件、網(wǎng)站建設(shè)、龍?zhí)毒W(wǎng)站維護、網(wǎng)站推廣。
2) 使用 SO_NOSIGPIPE。 經(jīng)實驗在多個ios版本下都不再觸發(fā)SIGPIPE,完美解決問題。
int?set?=?1;??
setsockopt(sd,?SOL_SOCKET,?SO_NOSIGPIPE,?(void?*)set,?sizeof(int));
隨著項目的開發(fā)進行,對于ios程序崩潰及解決方法有一定的認(rèn)識,現(xiàn)總結(jié)如下:
1:@selector提供的選擇器未定義,運行時造成程序崩潰。
2:程序中父類對象已銷毀,但后續(xù)操作還在使用其子對象。
3:多次release,造成對象引用技術(shù)為負數(shù), 然后后續(xù)還使用。
4:在程序的聲明處指定使用assign屬性,然而在dealloc的時候卻對其進行release。
對于崩潰問題可以嘗試使用 Project-Profile, 連上真機,選擇Devices, 然后彈出的instruments-》Zombie. 運行程序,直到程序崩潰。
這時候工具就會捕獲到崩潰代碼同時提供引用基數(shù)產(chǎn)生及釋放的全部過程。
如果你是通過xCode來查看崩潰的位置,有時候會不正確。這個要多加注意
問題里的“秒退”如果我沒理解錯,應(yīng)該是指程序顯示完默認(rèn)啟動圖片后,在初始化階段就崩潰了(也可以叫“閃退”,不過最近“閃退”這個詞已經(jīng)被廣泛應(yīng)用于各種程序崩潰情況了,所以可能還是“秒退”更準(zhǔn)確?)。
這種情況應(yīng)和所謂的內(nèi)存不足關(guān)系不大,很少有程序會在初始化時載入大量內(nèi)容導(dǎo)致崩潰,并且這類問題也很容易在開發(fā)階段被發(fā)現(xiàn),所以內(nèi)存不足造成秒退的可能性低(內(nèi)存不足退,通常是程序用了一段時間,切換了幾個畫面以后發(fā)生的)。
而且秒退是發(fā)生在程序剛剛啟動的時候,在開發(fā)、蘋果審核階段都沒有被發(fā)現(xiàn)的最大可能性就是,這個問題只會發(fā)生在老版系統(tǒng)、老版機型上。
對于很多開發(fā)者(尤其是個人開發(fā)者),進行所有 iOS 版本,所有 iOS 機型覆蓋測試是有難度的,蘋果審核時也只是重點審核該應(yīng)用在新機器、新版本下的運行情況,并不關(guān)注老系統(tǒng)。所以這也就是為什么會秒退的程序竟然也能通過蘋果的審核。
在新 iOS 上正常的應(yīng)用,到了老版本 iOS 上秒退最常見原因是系統(tǒng)動態(tài)鏈接庫或Framework無法找到。這種情況通常是由于 App 引用了一個新版操作系統(tǒng)里的動態(tài)庫(或者某動態(tài)庫的新版本)或只有新 iOS 支持的 Framework,而又沒有對老系統(tǒng)進行測試,于是當(dāng) App 運行在老系統(tǒng)上時便由于找不到而秒退。解決辦法是等開發(fā)人員發(fā)現(xiàn)這個問題后升級程序,或由用戶自行升級其操作系統(tǒng)。
還有一種常見的秒退是程序在升級時,修改了本地存儲的數(shù)據(jù)結(jié)構(gòu),但是對用戶既存的舊數(shù)據(jù)沒有做好升級,結(jié)果導(dǎo)致初始化時因為無法正確讀取用戶數(shù)據(jù)而秒退。這類問題通常只需刪除程序后重新安裝一遍就能解決。但缺點是用戶的既存數(shù)據(jù)會丟失——就算有備份可能也無濟于事,因為備份下來的舊數(shù)據(jù)還是無法被正確升級。如果舊數(shù)據(jù)非常重要,那么就需要聯(lián)系開發(fā)人員要求其進行程序修正了。
另一種已經(jīng)變得不那么常見的秒退原因是 App 的設(shè)置不正確。例如在編譯時沒有編譯 ARMv6 的版本,但是設(shè)置里卻允許該 App 運行在 ARMv6 處理器的機器上(如:iPhone 1代,iPhone 3G,iPod touch 1、2代和3代8G版)。這個問題除了等開發(fā)人員升級外用戶自己沒什么辦法解決。當(dāng)然愿意換臺新機器是最好的 ;) 這個問題目前已經(jīng)能夠在提交應(yīng)用至 App Store 的時候被檢查出來了,因此今后應(yīng)該不太常見了。
還有一類秒退或是用到 App 里某個功能后必退的原因,是開發(fā)時用到了只有新版操作系統(tǒng)才支持的某個方法,而又沒有對該方法是否存在于老系統(tǒng)中做出判斷。例如程序啟動時用到了 Game Center,而沒有判斷用戶的機器是否支持 Game Center,于是就秒退了。
主要的秒退情況就是這么幾個,這些都是以該 App 新版系統(tǒng)上能正常跑為前提的。
諸如內(nèi)存不足、BAD_ACCESS 這類問題通常不管在新舊 iOS 上都會存在,如果是由于這類問題造成的秒退通常都能在測試和審核階段被發(fā)現(xiàn),因此并不常見。
iOS閃退,就是軟件崩潰,或者iOS突然關(guān)閉機器重啟。 軟件閃退是軟件本身的bug或者泄露造成的,重新啟動軟件即可。 機器閃退一個是越獄造成的,如果沒越獄的話是內(nèi)存泄露造成的。沒什么辦法防止。閃退的解決方法就是重啟,軟件或者機器。
[img]