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下的调试技巧相关推荐

  1. JavaScript 逆向调试技巧

    前段时间尝试对某音的 PC 端进行了逆向,目前已经全部逆向出来了,在这里总结下一些调试技巧和总结. 本文不会涉及任何的详细代码,仅仅是作为技术来讨论. 一.加密分析 在这里以账户下的视频列表为例,可以 ...

  2. iphone XCode调试技巧之EXC_BAD_ACCESS中BUG解决

    http://mobile.51cto.com/iphone-279455.htm XCode调试技巧之EXC_BAD_ACCESS中BUG解决是本文要介绍的内容,在iphone开发的时候EXC_BA ...

  3. VC++设置Release模式下允许调试代码

    2019独角兽企业重金招聘Python工程师标准>>> 在Release中允许代码调试,只需要关闭代码优化,设置调试信息输出就可以了.以VS2015为例,说明如何设置相关项目属性,其 ...

  4. 【Flutter】Flutter 混合开发 ( Dart 代码调试 | Flutter 单独调试 | 混合模式下 Flutter 调试 )

    文章目录 前言 一.单独运行 Flutter 代码时调试 Dart 代码 二.混合模式下 Flutter 调试 Dart 代码 三.相关资源 前言 Flutter 混合开发集成步骤 : ① 在 And ...

  5. Visual Studio原生开发的20条调试技巧(下)

    我的上篇文章<Vistual Studio原生开发的10个调试技巧>引发了很多人的兴趣,所以我决定跟大家分享更多的调试技巧.接下来你又能看到一些对于原生应用程序的很有帮助的调试技巧(接着上 ...

  6. linux下gdb调试方法和技巧详解

    linux下gdb调试方法和技巧整理 简介 UNIX或者UNIX-like下调试工具 启动gdb # 1. 在可执行程序不需要输入参数时,我们可以使用 gdb + 可执行程序 gdb ./typeid ...

  7. SAP Spartacus服务器端渲染模式下的调试方法

    在使用本文章介绍的步骤进行SAP Spartacus Storefront在服务器端渲染模式(SSR)下的调试之前,请您确保已经按照如下帮助文档的介绍,已经成功启用了服务器端渲染: https://s ...

  8. 命令行下 pdb 调试 Python 程序

    官方参考网站 The Python Debugger : https://docs.python.org/3/library/pdb.html gdb 调试命令的使用及总结:https://blog. ...

  9. vs.php在win2008+vs2008下开发调试配置

    装了个VS.Php.for.Visual.Studio.2008的开发工具,这个工具可以在vs的IDE环境下开发调试php程序.因为我的系统是win2008,IIS7对php的支持据说非常的好,可以不 ...

最新文章

  1. 最小生成树(kruskal+prime)
  2. Kubernetes的四种用户部署场景
  3. SpringBoot+MyBatisPlus实现插入关联多表数据的接口(企业质检管理举例)
  4. kali之metasploit基本使用
  5. 前端学习(1842):前端面试题之vue组件调用方式
  6. 数据结构+算法 学习计划与资源
  7. java接口源码_java collection接口源码
  8. TypeScript基本数据类型
  9. 《精通Android 5 多媒体开发》——第6章,第6.1节视频系统结构
  10. Focal loss及其实现
  11. springCloud—Eureka知识点总结
  12. kali导入mysql备份_生产环境web站点及mysql数据库备份案例
  13. R语言相关性分析与偏相关分析
  14. 一叶落而知天下秋暨“今目标”反思
  15. 矩阵开根号,工作矩阵平方根
  16. mac双系统下在移动硬盘安装linux,MAC系统下外置移动硬盘安装windows双系统教程。...
  17. vim配置——MA6174
  18. c语言中线性与非线性,最小二乘法 线性与非线性拟合
  19. windows如何切换到administrtor用户
  20. 欧洲篮球冠军联赛网站

热门文章

  1. OpenGL Blinn-Phong Shader实例
  2. C++实现bellman ford贝尔曼-福特算法(最短路径)(附完整源码)
  3. C语言关于符号#和##
  4. QT的QUndoCommand类的使用
  5. QT的QStylePlugin类的使用
  6. QT的QSortFilterProxyModel类的使用
  7. QT的QOpenGLFunctions类的使用
  8. php mysql source_详解MySQL数据库中有关source命令
  9. 页面伪静态化 java_UrlRewrite 伪静态化页面
  10. 「Python-Bug」pip is configured with locations that require TLS/SSL