在iOS开发过程中m,经常会出现EXC_BAD_ACCESS错误而导致程序崩溃。出现这个错误的原因是由于你的对象已经被释放了,而你又调用了它的方法,相当于java中的空指针异常。很多iOS新手基本上都会遇到这个问题,尤其是对象使用了autorelease,或者自己手工过早的把对象release了。

    解决这个问题很简单,首先要定位到是哪个对象被释放。一旦出现EXC_BAD_ACCESS,程序会僵死掉,也就是所谓的Zombie,在xcode 做一些配置就可以看出是哪个对象出问题了,步骤如下(我的xcode版本是4.2):

    Product->EditScheme->Run->Environment Variables,添加NSZombieEnabled,并设置其值为YES,这样当出现

EXC_BAD_ACCESS,就可以在控制台中看到是哪个对象被释放掉了。

    另外要避免频繁的出现上述问题,下面是一些建议:

1. 当引用了别人传递进来的对象时,最好retain一下,避免在别人那里已经把对象release了,记得不用是要手工release

2. 如果使用了系统的通过静态方法来生成的对象,比如:[UIButton buttonWithType:UIButtonTypeRoundedRect],这些都是系统为了做好了autorelease,如果你不是很确定什么时候用到或者释放掉的话,最好也retain一下,同样记得用完后release掉

3. 一般建议在初始化的时候alloc你的对象,然后在delloc方法中释放,这样可以确保在整个过程中对象没有被release掉

4. 个人不太建议频繁的使用autorelease,一方面是,容易出现EXC_BAD_ACCESS错误;另一方面过多的使用autorelease会影响性能。因为autorelease不知道什么时候被释放,如果在多线程或者是大的循环中用到的话,会堆积大量的对象,这样你就不能依赖系统的autoReleasePool,而是要建立自己的autoReleasePool将他们包装起来,以便提前释放。显然用release就不会这么麻烦了。