EXC_BAD_ACCESS簡單理解
當(dāng)你遇到由EXC_BAD_ACCESS造成的崩潰時都许,那就意味著你向一個已經(jīng)釋放的對象發(fā)送消息涮拗。這是最常見的情況蛾默。
EXC_BAD_ACCESS的本質(zhì)
在C和Objective-C中静尼,你一直在處理指針塔逃。指針無非是存儲另一個變量的內(nèi)存地址的變量挖炬。當(dāng)您向一個對象發(fā)送消息時揽浙,指向該對象的指針將會被引用。這意味著,你獲取了指針?biāo)傅膬?nèi)存地址捏萍,并訪問該存儲區(qū)域的值太抓。
當(dāng)該存儲器區(qū)域不再映射到您的應(yīng)用時,或者換句話說令杈,該內(nèi)存區(qū)域在你認(rèn)為使用的時候卻沒有使用走敌,該內(nèi)存區(qū)域是無法訪問的。 這時內(nèi)核會拋出一個異常( EXC )逗噩,表明你的應(yīng)用程序不能訪問該存儲器區(qū)域(BAD ACCESS) 掉丽。
簡而言之,當(dāng)你碰到EXC_BAD_ACCESS 异雁,這意味著你試圖發(fā)送消息到的內(nèi)存塊捶障,但內(nèi)存塊無法執(zhí)行該消息。但是纲刀,在某些情況下项炼, EXC_BAD_ACCESS是由被損壞的指針引起的。每當(dāng)你的應(yīng)用程序嘗試引用損壞的指針示绊,一個異常就會被內(nèi)核拋出锭部。
EXC_BAD_ACCESS調(diào)試須知的三點
1、調(diào)試EXC_BAD_ACCESS可能會非常棘手和令人沮喪面褐。
2拌禾、你需要知道的是您的應(yīng)用程序并不一定是在崩潰的那一刻,無法訪問內(nèi)存區(qū)域展哭。這就是常使調(diào)試EXC_BAD_ACCESS變得困難的原因湃窍。
3、同樣受損指針也是如此匪傍。當(dāng)你的指針被損壞時您市,您的應(yīng)用程序不會崩潰。同時役衡,如果您在應(yīng)用程序中來回傳遞一個受損的指針也不會崩潰墨坚。當(dāng)應(yīng)用程序試圖引用受損指針的時候,就會發(fā)生奔潰映挂。
EXC_BAD_ACCESS調(diào)試——僵尸調(diào)試模式
在Xcode中,您可以啟用僵尸對象盗尸,這意味著被釋放的對象將會以僵尸的形式被保留柑船。換言之,保留釋放的對象就是為了調(diào)試泼各。這里沒有涉及任何魔法鞍时。如果您向僵尸對象發(fā)送消息,你的應(yīng)用程序?qū)捎贓XC_BAD_ACCESS而崩潰。
這有什么好處嗎逆巍?讓EXC_BAD_ACCESS難以調(diào)試的原因是及塘,你不知道你的應(yīng)用程序試圖訪問哪個對象。僵尸對象在許多情況下解決這個問題锐极。通過保留已釋放的對象笙僚,Xcode可以告訴你你試圖訪問哪個對象,這使的查找問題原因容易得多灵再。
僵尸調(diào)試模式具體操作
在Xcode中啟用僵尸對象是很容易的肋层。單擊左上角的Edit Scheme,并選中Edit Scheme翎迁。在左側(cè)選中Run 栋猖,在上方打開 Diagnostics選項。要啟用僵尸對象汪榔,勾選 Zombie Objects選框蒲拉。
如果你現(xiàn)在遇到EXC_BAD_ACCESS ,在Xcode的控制臺輸出痴腌,告訴你該從哪里查找問題雌团。看看下面的例子輸出衷掷。
-[CLTextView textInputView]: message sent to deallocated instance 0x7acb0200
在上面的例子中辱姨, Xcode告訴我們,textInputView的消息:被發(fā)送到一個僵尸對象戚嗅。然而雨涛,僵尸對象不再是CLTextView類的一個實例。以前分配給CLTextView實例的內(nèi)存區(qū)域不再映射到您的應(yīng)用程序懦胞。這為你了解問題產(chǎn)生的根本原因提供一個不錯的建議替久。不幸的是,僵尸對象將無法保存您的一天每次崩潰的EXC_BAD_ACCESS的記錄躏尉。既然僵尸對象沒有這些方法蚯根,那么你可以采取其他的方法進(jìn)行一些適當(dāng)?shù)姆治觥?br> 上面例子產(chǎn)生僵尸對象的原因:在寫UITextView分類時,添加了一個名字為UITextViewTextDidChangeNotification通知胀糜,使用完之后在下面代碼中釋放了颅拦,導(dǎo)致錯誤。
- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self
name:UITextViewTextDidChangeNotification
object:self];
}
Xcode分析項目(如果僵尸對象不能解決你的問題)
使用Xcode來分析你的項目教藻,從Xcode的 Product菜單選擇 Analyze或按 Shift-Command-B.Xcode的將需要片刻的時間距帅,但是當(dāng)它完成的時候你會在左邊的 Issue Navigator看到問題列表。由Analyze發(fā)現(xiàn)的問題用藍(lán)色高亮顯示括堤。
當(dāng)你點擊一個問題碌秸,Xcode的會指向問題代碼塊绍移,這些正是你要的注意的地方。注意讥电,Xcode僅僅是建議蹂窖。在某些情況下,這是可能的恩敌,問題是不相關(guān)的瞬测,不固定。如果你找不到造成EXC_BAD_ACCESS的錯誤潮剪,那就需要你仔細(xì)審視Xcode項目涣楷,分析其中發(fā)現(xiàn)的每一個問題。