EXC_BAD_ACCESS
2011-12-07 22:06
134 查看
iPhone Objective-C EXC_BAD_ACCESS问题
原文:http://ibuick.com/buick2011820/index.php/archives/objective-c-exc_bad_access写程序遇到 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);
}
}
首先说一下 EXC_BAD_ACCESS 这个错误,可以这么说,90%的错误来源在于对一个已经释放的对象进行release操作。
#import <Foundation/Foundation.h>
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
NSString* s = [[NSString alloc]initWithString:@”This is a test string”];
s = [s substringFromIndex:[s rangeOfString:@"a"].location];//内存泄露
[s release];//错误释放
[pool drain];//EXC_BAD_ACCESS
return 0;
}
Objective-C 这段代码有三个致命问题:1、内存泄露;2、错误释放;3、造成 EXC_BAD_ACCESS 错误。
1, NSString* s = [[NSString alloc]initWithString:@”This is a test string”]; 创建了一个 NSString Object,随后的 s = [s substringFromIndex:[s rangeOfString:@"a"].location]; 执行后,导致创建的对象引用消失,直接造成内存泄露。
2,错误释放。[s release]; 这个问题,
原因之一是一个逻辑错误,以为 s 还是我们最初创建的那个 NSString 对象。
第二是因为从 substringFromIndex:(NSUInteger i) 这个方法返回的 NSString 对象,并不需要我们来释放,它其实是一个被 substringFromIndex 方法标记为 autorelease 的对象。如果我们强行的释放了它,那么会造成 EXC_BAD_ACCESS 问题。
3, EXC_BAD_ACCESS。由于 s 指向的 NSString 对象被标记为 autorelease, 则在 NSAutoreleasePool 中已有记录。但是由于我们在前面错误的释放了该对象,则当 [pool drain] 的时候,NSAutoreleasePool 又一次的对它记录的 s 对象调用了 release 方法,但这个时候 s 已经被释放不复存在,则直接导致了 EXC_BAD_ACCESS问题。
查看更多的Console信息
工作区->Excuteables->双击其分组下的文件->Arguments设置运行参数
1: 为工程运行时加入 NSZombieEnabled 环境变量,则在 EXC_BAD_ACCESS 发生时,XCode 的 Console 会打印出问题描述。
2:加入 MallocStackLogging 来启用malloc记录
做如下设置:
Project -> Edit active executable ->Argument
添加如下四个参数
NSDebugEnabled
NSZombieEnabled
MallocStackLogging
MallocStackLoggingNoCompact
相关文章推荐
- EXC_BAD_ACCESS,XCode4
- EXC_BAD_ACCESS(code=1,address=0x40000000c)
- xcode 4.2 如何调试 EXC_BAD_ACCESS
- 关于出现僵尸信号SIGBAT或者EXC_BAD_ACCESS的解决方案
- iOS 崩溃调试 exc_bad_access(code=1,address=0x10)
- xcode 4.2 如何调试 EXC_BAD_ACCESS
- CEGUI InputManager* InputManager::createInputSystem EXC_BAD_ACCESS
- iOS 开发之EXC_BAD_ACCESS异常分析
- iphone开发中EXC_BAD_ACCESS抛出错误
- ios-iPhone Objective-C EXC_BAD_ACCESS问题
- 查找 EXC_BAD_ACCESS 问题根源的方法
- iOS开发EXC_BAD_ACCESS异常介绍
- 当程序崩溃的时候怎么办1 EXC_BAD_ACCESS
- 崩溃问题之EXC_BAD_ACCESS
- message sent to deallocated instance EXC_BAD_ACCESS 获取更多调试信息
- 討厭的 EXC_BAD_ACCESS
- 关于EXC_BAD_ACCESS,以及解决办法
- asiHttpRequest 取消访问的时候跳exc_bad_access
- ios调度EXC_BAD_ACCESS
- XCode调试技巧之EXC_BAD_ACCESS中BUG