2019独角兽企业重金招聘Python工程师标准>>>

写程序遇到 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 会打印出问题描述。

首先双击 XCode 工程中,Executables 下的 可执行模组,

2:加入 MallocStackLogging 来启用malloc记录

做如下设置:

Project -> Edit active executable ->Argument

添加如下四个参数

NSDebugEnabled

NSZombieEnabled

MallocStackLogging

MallocStackLoggingNoCompact

转载于:https://my.oschina.net/rareliu/blog/17440

iPhone Objective-C EXC_BAD_ACCESS问题相关推荐

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

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

  2. iPhone软件开发编程语言Objective C学习资料

    iPhone软件开发编程语言Objective C学习资料 一.XCode.Objective-C.Cocoa说的是几样东西? 答案:三样东西.   XCode:你可以把它看成是一个开发环境,就好像V ...

  3. Can‘t we be more objective?:Is huawei better than iphone?

    My opinion is yes. 100%. Here's why: Price: I always start with price, because that is simply the wo ...

  4. EXC_BAD_ACCESS iphone

    from:http://www.cocoachina.com/macdev/tips/2012/1120/5136.html 打开Scheme选项选择EditScheme. 然后按图勾上Enable ...

  5. Objective C内存管理之理解autorelease------面试题

    Objective C内存管理之理解autorelease Autorelease实际上只是把对release的调用延迟了,对于每一个Autorelease,系统只是把该Object放入了当前的Aut ...

  6. 如何定位EXC_BAD_ACCESS错误 (info malloc-history)

    在 iphone 开发中使用内存时,我们经常会遇到 EXC_BAD_ACCESS 的错误. 出现这个错误的原因是我们访问了一个已经被释放掉的对象,如: @implementation Feedback ...

  7. (转载)如何学好iphone游戏开发

    转自:http://www.cnblogs.com/zilongshanren/archive/2011/09/19/2181558.html 自从发布<如何学习iphone游戏开发>到 ...

  8. Adobe宣布不再针对iPhone开发Flash工具

    新浪科技讯 北京时间4月21日晚间消息,据国外媒体报道,Adobe宣布将不再开发新版本的"Packager for iPhone"工具包,这一工具包可以将Flash应用转换为iPh ...

  9. 10个步骤:如何成为iPhone游戏开发者

    2019独角兽企业重金招聘Python工程师标准>>> 10个步骤:如何成为iPhone游戏开发者 译者:darrenest Neil Ferguson,是iPhone 游戏「病毒攻 ...

最新文章

  1. 使用Bot Service创建Bot Framework
  2. Android:页面跳转传参方式一,页面跳转传参方式二
  3. Codeforces 769D k-Интересные пары чисел
  4. 线上分享 | 增长思维:如何选择最优增长模式?
  5. 合并两个无序数组java_88. 合并两个有序数组
  6. SPLT(Skimming-Perusal Tracking)算法详解
  7. 异常信息java.lang.Object.wait(Native Method) java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:
  8. 深入Managed DirectX9(二)
  9. 鸿蒙卡片-物联网DTU污水液位计卡片
  10. 学习记录-操作系统知识(1)
  11. 【Paper】DeepConvLSTM:Deep Convolutional and LSTM RNN for Multimodal Wearable Activity Recognition
  12. 高速信号采集的相关知识
  13. 学习:名词定义 大数据 Saas Paas Iaas
  14. 从零学会Photoshop经典教程300集
  15. 计算机相关专业零基础论文画图详细教程(避免掉坑教程)
  16. 使用系统自带计算器进行二进制运算
  17. 微信小程序实现星级评价和效果展示
  18. 关于AE渲染高清GIF图片的解决方案
  19. Android的webview加载本地html、本apk内html和远程URL
  20. 使用postman生成测试报告

热门文章

  1. 一道求因子之和面试算法题
  2. apt-get出错,由于出现了太多错误,处理过程被终止
  3. proj编译linux,在Ubuntu上安装proj 投影转换程序
  4. 湖北理工学院c语言实验报告答案,湖北理工学院c语言实验报告七答案.doc
  5. python约瑟夫环_Python语言之如何实现约瑟夫环问题
  6. java servlet init方法_Servlet详解之两个init方法的作用
  7. iphone主屏幕动态壁纸_苹果11怎么设置动态壁纸?这个简单!只需这样操作
  8. docker安装指定版本的tag镜像
  9. 基于隐马尔可夫模型的有监督词性标注
  10. k均值的损失函数_机器学习:手撕 cross-entropy 损失函数