ios-iPhone Objective-C EXC_BAD_ACCESS问题
2015-11-03 11:27
309 查看
iPhone Objective-C EXC_BAD_ACCESS问题
写程序遇到 Bug 并不可怕,大部分的问题,通过简单的 Log 或者 代码分析并不难找到原因所在。但是在 Objective-C 编程中遇到 EXC_BAD_ACCESS 问题的时候,通过简单常规的手段很难发现问题。
Objective-C 这段代码有三个致命问题:1、内存泄露;2、错误释放;3、造成 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
写程序遇到 Bug 并不可怕,大部分的问题,通过简单的 Log 或者 代码分析并不难找到原因所在。但是在 Objective-C 编程中遇到 EXC_BAD_ACCESS 问题的时候,通过简单常规的手段很难发现问题。
写程序遇到 Bug 并不可怕,大部分的问题,通过简单的 Log 或者 代码分析并不难找到原因所在。但是在 Objective-C 编程中遇到 EXC_BAD_ACCESS 问题的时候,通过简单常规的手段很难发现问题。这篇文章,给大家介绍一个常用的查找 EXC_BAD_ACCESS 问题根源的方法。 首先说一下 EXC_BAD_ACCESS 这个错误,可以这么说,90%的错误来源在于对一个已经释放的对象进行release操作。
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
相关文章推荐
- Does GATHER_STATS_JOB gather all objects’ stats every time?
- sqlserver system object type
- ios 关联对象运用 objc_setAssociatedObject
- Objective-C中的@property和@synthesize用法
- JSONObject文档
- NSMutableAttributedStrings - objectAtIndex:effectiveRange:: Out of bounds错误解决
- id、NSObject *、id<NSObject>、instancetype
- Objective-C之@类别小实例
- PO模式(Page Object Model)
- PHP、JAVA、C#、Object-C 通用的DES加密
- iPhone开发中,在XCode下混合编译 C++/Objective-C
- Objective C(OC)面向对象三大特性之:封装
- Objective -C学习笔记 之copy(复制)
- Objective-C函数指针
- 建议采用的顺序是 List<T>、List<?>、List<Object>
- Objective-C:copy的用法解释
- (OC)基础第二讲:实例变量可见度、方法
- 论文笔记:Rich feature hierarchies for accurate object detection and semantic segmentation
- JavaScript中in操作符(for..in)、Object.keys()和Object.getOwnPropertyNames()的区别
- Objective-C中的Protocol