iOS中EXC_BAD_ACCESS解决办法
? ? 在iOS開發(fā)過程中m,經(jīng)常會(huì)出現(xiàn)EXC_BAD_ACCESS錯(cuò)誤而導(dǎo)致程序崩潰。出現(xiàn)這個(gè)錯(cuò)誤的原因是由于你的對(duì)象已經(jīng)被釋放了,而你又調(diào)用了它的方法,相當(dāng)于java中的空指針異常。很多iOS新手基本上都會(huì)遇到這個(gè)問題,尤其是對(duì)象使用了autorelease,或者自己手工過早的把對(duì)象release了。
? ? 解決這個(gè)問題很簡單,首先要定位到是哪個(gè)對(duì)象被釋放。一旦出現(xiàn)EXC_BAD_ACCESS,程序會(huì)僵死掉,也就是所謂的Zombie,在xcode 做一些配置就可以看出是哪個(gè)對(duì)象出問題了,步驟如下(我的xcode版本是4.2):
? ??Product->EditScheme->Run->Environment Variables,添加NSZombieEnabled,并設(shè)置其值為YES,這樣當(dāng)出現(xiàn)
EXC_BAD_ACCESS,就可以在控制臺(tái)中看到是哪個(gè)對(duì)象被釋放掉了。
? ? 另外要避免頻繁的出現(xiàn)上述問題,下面是一些建議:
1. 當(dāng)引用了別人傳遞進(jìn)來的對(duì)象時(shí),最好retain一下,避免在別人那里已經(jīng)把對(duì)象release了,記得不用是要手工release
2. 如果使用了系統(tǒng)的通過靜態(tài)方法來生成的對(duì)象,比如:[UIButton buttonWithType:UIButtonTypeRoundedRect],這些都是系統(tǒng)為了做好了autorelease,如果你不是很確定什么時(shí)候用到或者釋放掉的話,最好也retain一下,同樣記得用完后release掉
3. 一般建議在初始化的時(shí)候alloc你的對(duì)象,然后在delloc方法中釋放,這樣可以確保在整個(gè)過程中對(duì)象沒有被release掉
4. 個(gè)人不太建議頻繁的使用autorelease,一方面是,容易出現(xiàn)EXC_BAD_ACCESS錯(cuò)誤;另一方面過多的使用autorelease會(huì)影響性能。因?yàn)閍utorelease不知道什么時(shí)候被釋放,如果在多線程或者是大的循環(huán)中用到的話,會(huì)堆積大量的對(duì)象,這樣你就不能依賴系統(tǒng)的autoReleasePool,而是要建立自己的autoReleasePool將他們包裝起來,以便提前釋放。顯然用release就不會(huì)這么麻煩了。
轉(zhuǎn)載于:https://blog.51cto.com/ikinglai/1079760
總結(jié)
以上是生活随笔為你收集整理的iOS中EXC_BAD_ACCESS解决办法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Exchange DAG备份恢复(六)-
- 下一篇: 【TDS学习文档4】IBM Direct