日期:2014-05-16  浏览次数:20987 次

xcode crash 查找 EXC_BAD_ACCESS 问题根源的方法

xcode4 4.x

?

EXC_BAD_ACCESS这个问题一直不好调试,之前有看到过说配置一个环境变量可以很方便的跟踪问题,因此试了一下,发现还真是方便了很多,以下是XCODE 4的配置方法:

Edit Scheme->Arguments->Environment variables

增加 NSZombieEnabled ,设置为YES,并勾选上,OK,再次运行,在console就会显示出出错的地方了.

(另外:

NSLog(@"id :?%@",id);??? //id is integer,should be printed as?%d

像这样的语句也会引起EXC_BAD_ACCESS,大家要注意了哦

)

?

?

?

?

xcode 3.x.x

http://www.cocoachina.com/macdev/objc/2011/0219/2661.html

写程序遇到 Bug 并不可怕,大部分的问题,通过简单的 Log 或者 代码分析并不难找到原因所在。但是在 Objective-C 编程中遇到 EXC_BAD_ACCESS 问题的时候,通过简单常规的手段很难发现问题。

??? 写程序遇到 Bug 并不可怕,大部分的问题,通过简单的 Log 或者 代码分析并不难找到原因所在。但是在 Objective-C 编程中遇到 EXC_BAD_ACCESS 问题的时候,通过简单常规的手段很难发现问题。这篇文章,给大家介绍一个常用的查找 EXC_BAD_ACCESS 问题根源的方法。

??? 首先说一下 EXC_BAD_ACCESS 这个错误,可以这么说,90%的错误来源在于对一个已经释放的对象进行release操作。举一个简单的例子来说明吧,首先看一段Java代码:

public class Test{
??????? public static void main(String[] args){
??????????????? String s = “This is a test string”;
??????????????? s = s.substring(s.indexOf(“a”),(s.length()));
??????????????? System.out.println(s);
????????????????
??????? }
}

??? 这种写法在Java中很常见也很普遍,这不会产生任何问题。但是到了 Objective-C 中,就会出事,考虑这个程序:

#import <Foundation/Foundation.h>

int main (int argc, const char * argv[]) {
NSAutoreleasePool * p