iPhone Objective-C EXC_BAD_ACCESS问题
2019独角兽企业重金招聘Python工程师标准>>>
写程序遇到 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问题相关推荐
- iphone XCode调试技巧之EXC_BAD_ACCESS中BUG解决
http://mobile.51cto.com/iphone-279455.htm XCode调试技巧之EXC_BAD_ACCESS中BUG解决是本文要介绍的内容,在iphone开发的时候EXC_BA ...
- iPhone软件开发编程语言Objective C学习资料
iPhone软件开发编程语言Objective C学习资料 一.XCode.Objective-C.Cocoa说的是几样东西? 答案:三样东西. XCode:你可以把它看成是一个开发环境,就好像V ...
- 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 ...
- EXC_BAD_ACCESS iphone
from:http://www.cocoachina.com/macdev/tips/2012/1120/5136.html 打开Scheme选项选择EditScheme. 然后按图勾上Enable ...
- Objective C内存管理之理解autorelease------面试题
Objective C内存管理之理解autorelease Autorelease实际上只是把对release的调用延迟了,对于每一个Autorelease,系统只是把该Object放入了当前的Aut ...
- 如何定位EXC_BAD_ACCESS错误 (info malloc-history)
在 iphone 开发中使用内存时,我们经常会遇到 EXC_BAD_ACCESS 的错误. 出现这个错误的原因是我们访问了一个已经被释放掉的对象,如: @implementation Feedback ...
- (转载)如何学好iphone游戏开发
转自:http://www.cnblogs.com/zilongshanren/archive/2011/09/19/2181558.html 自从发布<如何学习iphone游戏开发>到 ...
- Adobe宣布不再针对iPhone开发Flash工具
新浪科技讯 北京时间4月21日晚间消息,据国外媒体报道,Adobe宣布将不再开发新版本的"Packager for iPhone"工具包,这一工具包可以将Flash应用转换为iPh ...
- 10个步骤:如何成为iPhone游戏开发者
2019独角兽企业重金招聘Python工程师标准>>> 10个步骤:如何成为iPhone游戏开发者 译者:darrenest Neil Ferguson,是iPhone 游戏「病毒攻 ...
最新文章
- 使用Bot Service创建Bot Framework
- Android:页面跳转传参方式一,页面跳转传参方式二
- Codeforces 769D k-Интересные пары чисел
- 线上分享 | 增长思维:如何选择最优增长模式?
- 合并两个无序数组java_88. 合并两个有序数组
- SPLT(Skimming-Perusal Tracking)算法详解
- 异常信息java.lang.Object.wait(Native Method) java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:
- 深入Managed DirectX9(二)
- 鸿蒙卡片-物联网DTU污水液位计卡片
- 学习记录-操作系统知识(1)
- 【Paper】DeepConvLSTM:Deep Convolutional and LSTM RNN for Multimodal Wearable Activity Recognition
- 高速信号采集的相关知识
- 学习:名词定义 大数据 Saas Paas Iaas
- 从零学会Photoshop经典教程300集
- 计算机相关专业零基础论文画图详细教程(避免掉坑教程)
- 使用系统自带计算器进行二进制运算
- 微信小程序实现星级评价和效果展示
- 关于AE渲染高清GIF图片的解决方案
- Android的webview加载本地html、本apk内html和远程URL
- 使用postman生成测试报告
热门文章
- 一道求因子之和面试算法题
- apt-get出错,由于出现了太多错误,处理过程被终止
- proj编译linux,在Ubuntu上安装proj 投影转换程序
- 湖北理工学院c语言实验报告答案,湖北理工学院c语言实验报告七答案.doc
- python约瑟夫环_Python语言之如何实现约瑟夫环问题
- java servlet init方法_Servlet详解之两个init方法的作用
- iphone主屏幕动态壁纸_苹果11怎么设置动态壁纸?这个简单!只需这样操作
- docker安装指定版本的tag镜像
- 基于隐马尔可夫模型的有监督词性标注
- k均值的损失函数_机器学习:手撕 cross-entropy 损失函数