【转】EXC_BAD_ACCESS问题在xode4下的调试技巧
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,大家要注意了哦 )
首先说一下 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
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问题。
【转】EXC_BAD_ACCESS问题在xode4下的调试技巧相关推荐
- JavaScript 逆向调试技巧
前段时间尝试对某音的 PC 端进行了逆向,目前已经全部逆向出来了,在这里总结下一些调试技巧和总结. 本文不会涉及任何的详细代码,仅仅是作为技术来讨论. 一.加密分析 在这里以账户下的视频列表为例,可以 ...
- iphone XCode调试技巧之EXC_BAD_ACCESS中BUG解决
http://mobile.51cto.com/iphone-279455.htm XCode调试技巧之EXC_BAD_ACCESS中BUG解决是本文要介绍的内容,在iphone开发的时候EXC_BA ...
- VC++设置Release模式下允许调试代码
2019独角兽企业重金招聘Python工程师标准>>> 在Release中允许代码调试,只需要关闭代码优化,设置调试信息输出就可以了.以VS2015为例,说明如何设置相关项目属性,其 ...
- 【Flutter】Flutter 混合开发 ( Dart 代码调试 | Flutter 单独调试 | 混合模式下 Flutter 调试 )
文章目录 前言 一.单独运行 Flutter 代码时调试 Dart 代码 二.混合模式下 Flutter 调试 Dart 代码 三.相关资源 前言 Flutter 混合开发集成步骤 : ① 在 And ...
- Visual Studio原生开发的20条调试技巧(下)
我的上篇文章<Vistual Studio原生开发的10个调试技巧>引发了很多人的兴趣,所以我决定跟大家分享更多的调试技巧.接下来你又能看到一些对于原生应用程序的很有帮助的调试技巧(接着上 ...
- linux下gdb调试方法和技巧详解
linux下gdb调试方法和技巧整理 简介 UNIX或者UNIX-like下调试工具 启动gdb # 1. 在可执行程序不需要输入参数时,我们可以使用 gdb + 可执行程序 gdb ./typeid ...
- SAP Spartacus服务器端渲染模式下的调试方法
在使用本文章介绍的步骤进行SAP Spartacus Storefront在服务器端渲染模式(SSR)下的调试之前,请您确保已经按照如下帮助文档的介绍,已经成功启用了服务器端渲染: https://s ...
- 命令行下 pdb 调试 Python 程序
官方参考网站 The Python Debugger : https://docs.python.org/3/library/pdb.html gdb 调试命令的使用及总结:https://blog. ...
- vs.php在win2008+vs2008下开发调试配置
装了个VS.Php.for.Visual.Studio.2008的开发工具,这个工具可以在vs的IDE环境下开发调试php程序.因为我的系统是win2008,IIS7对php的支持据说非常的好,可以不 ...
最新文章
- 最小生成树(kruskal+prime)
- Kubernetes的四种用户部署场景
- SpringBoot+MyBatisPlus实现插入关联多表数据的接口(企业质检管理举例)
- kali之metasploit基本使用
- 前端学习(1842):前端面试题之vue组件调用方式
- 数据结构+算法 学习计划与资源
- java接口源码_java collection接口源码
- TypeScript基本数据类型
- 《精通Android 5 多媒体开发》——第6章,第6.1节视频系统结构
- Focal loss及其实现
- springCloud—Eureka知识点总结
- kali导入mysql备份_生产环境web站点及mysql数据库备份案例
- R语言相关性分析与偏相关分析
- 一叶落而知天下秋暨“今目标”反思
- 矩阵开根号,工作矩阵平方根
- mac双系统下在移动硬盘安装linux,MAC系统下外置移动硬盘安装windows双系统教程。...
- vim配置——MA6174
- c语言中线性与非线性,最小二乘法 线性与非线性拟合
- windows如何切换到administrtor用户
- 欧洲篮球冠军联赛网站
热门文章
- OpenGL Blinn-Phong Shader实例
- C++实现bellman ford贝尔曼-福特算法(最短路径)(附完整源码)
- C语言关于符号#和##
- QT的QUndoCommand类的使用
- QT的QStylePlugin类的使用
- QT的QSortFilterProxyModel类的使用
- QT的QOpenGLFunctions类的使用
- php mysql source_详解MySQL数据库中有关source命令
- 页面伪静态化 java_UrlRewrite 伪静态化页面
- 「Python-Bug」pip is configured with locations that require TLS/SSL