http://unmi.cc/nszombieenabled-locate-exc_bad_access-error
我们做 iOS 程序开发时经常用遇到 EXC_BAD_ACCESS 错误导致 Crash,出现这种错误时一般 Xcode 不会给我们太多的信息来定位错误来源,只是在应用 Delegate 上留下像 Thread 1: Program received signal: "EXC_BAD_ACCESS",让问题无从找起。
比如你对已释放的对象发送消息时就会出现,EXC_BAD_ACCESS,再如 release 的对象再 release,release 那些 autorelease 的对象等也会报这样的错。默认设置下 Xcode 不会给你定位具体是哪一行代码,不该去使用已释放的对象,或者 release 用错了。
比如 UIViewController 子类中这样的代码:
01
02
03
04
05
06
07
08
09
10
11
12
|
static NSMutableArray *array;
- ( void )viewDidLoad
{
[ super viewDidLoad];
array = [[ NSMutableArray alloc] initWithCapacity:5];
[array release];
}
- ( void ) viewWillAppear:( BOOL )animated {
[array addObject:@ "Hello" ];
}
|
上面的代码就会出现 EXC_BAD_ACCESS 错误,但我执行时 Xcode 一出错却是定位在我在 AppDelegate 的 application:didFinishLaunchingWithOptions: 方法上的某行了,如果代码量多了,要查找具体问题非常难,但凭经验了。
不过 NSZombieEnabled 环境变量可以帮我们的忙,就是当设置NSZombieEnabled环境变量后,一个对象销毁时会被转化为_NSZombie,设置NSZombieEnabled后,当你向一个已经释放的对象发送消息,这个对象就不会向之前那样Crash或者产生 一个难以理解的行为,而是放出一个错误消息,然后以一种可预测的可以产生debug断点的方式消失, 因此我们就可以找到具体或者大概是哪 个对象被错误的释放了。
对 Xcode 设置了 NSZombieEnabled 之后,Xcode 会明确定位在行 [array addObject:@"Hello"],然后控制台下报的错误信息是:
*** -[__NSArrayM addObject:]: message sent to deallocated instance 0x6557370
如何设置 NSZombieEnabled 呢,在 Xcode3 和 Xcode4 下设置不一样,Xcode4 下设置很简单。
Xcode3 下 NSZombieEnabled 设置方法如下:
1. 在XCode左边那个Groups & Files栏中找到Executables,双击其中的一项,或者右键Get Info;
2. 切换到Arguments
3. 这里一共有两个框,在下面那个Variables to be set in the environment:点+号添加一项,Name里填NSZombieEnabled,Value填Yes,要保证前面的钩是选中的。
Xcode4 下设置 NSZombieEnabled 的方法:
你可以点击 Xcode4 菜单 Product -> Edit Scheme -> Arguments, 然后将点击”加号”, 将 NSZombieEnabled 参数加到 Environment Variables 窗口中, 后面的数值写上 ”YES”.
或者在 Xcode4 菜单 Product -> Edit Scheme -> Diagnostics 设置窗口中直接勾上 Enable Zombie Objects 即可,Xcode 可用 cmd+shift+< 进到这个窗口。
Xcode4 已经考虑到了现在的要求,所以提供了更便捷的设置的方式,你也可以在这个窗口中设置其他一些参数,你肯定能由此获得更多的帮助信息。
另外再说一下,如果没有为 Xcode 设置 NSZombieEnable,像下面的代码或许可以正确执行,打印出你所期望的结果 “Hello”
01
02
03
04
05
06
07
08
09
10
|
static NSMutableArray *array;
- ( void )viewDidLoad
{
[ super viewDidLoad];
array = [[ NSMutableArray alloc] initWithCapacity:5];
[array release];
[array addObject:@ "Hello" ];
NSLog (@ "%@" , [array objectAtIndex:0]);
}
|
但是一旦加上了 NSZombieEnable 设置,上面的代码行 [array addObject:@"Hello"] 也将无法投机取巧了,同样会得到错误提示:
*** -[__NSArrayM addObject:]: message sent to deallocated instance 0x6557370
即使该 array 所指向的内存还是原来的数据也不能逃脱掉 NSZombieEnable 的法眼。也就是之所以未设置 NSZombieEnable 时上面代码能得到正确结果,是因为,虽然 [array release] 是标记为释放掉该内存块,但是后面使用 array 时,因为该指针指向的内存数据未被覆盖,所以未出错,这和 C++ 的指针 delete 后的效果是一样的。
参考:1. 设置NSZombieEnabled解决EXC_BAD_ACCESS错误
2. 查找 EXC_BAD_ACCESS 问题根源的方法
3. XCode调试技巧-纠结的EXC_BAD_ACCESS
分享到:
相关推荐
这里讲述在没有ARC的情况下,如何使用Instruments来查找程序中的内存泄露,以及NSZombieEnabled设置的使用。本文假设你已经比较熟悉Obj-C的内存管理机制。实验的开发环境:XCode4.5.2先下载一个实现准备好的内存泄露...
NSZombieEnabled Xcode 3.2 Errors / Warnings Xcode 3.2 Static Analyzer Demo ---App Development--- Provisioning Profile tips iTunes Connect App Submission Tips Analytics tracking Score / Networking ...
私信博主免费看所有华为OD真题、考试报告、手撕代码、面试记录
系统概述 图形学程序通常包括以下几个关键组件: 用户界面(UI):提供用户交互界面,展示图形和接收用户输入。 图形渲染模块:负责绘制点、线、多边形等基本图形。 图形变换模块:实现图形的平移、旋转、缩放等变换。 事件处理模块:处理用户的鼠标点击、键盘输入等事件。 数据结构:存储图形的顶点、边等数据。 主要功能 基本图形绘制:绘制点、线段、圆形、多边形等。 图形变换:对图形进行平移、旋转、缩放等操作。 颜色和样式设置:设置图形的颜色和线型。 交互操作:响应用户的鼠标和键盘操作。 图形保存与加载:将绘制的图形保存到文件,并从文件加载。 技术架构 Java:作为主要的编程语言。 AWT/Swing:用于构建图形用户界面。 Java 2D API:用于绘制图形和实现图形变换。 开发优势 跨平台:Java的跨平台特性,使程序可以在多种操作系统上运行。 丰富的图形库:Java提供了丰富的图形库,简化了图形绘制和变换的实现。 社区支持:Java有庞大的开发者社区,提供丰富的资源和支持。 结论 基于Java的图形学程序是一个展示编程技能和图形学概念的好项目,适合作为学术项目或个人兴趣开发。
2024嵌入式面试资料浙江大华(1)提取方式是百度网盘分享地址
2023人形机器人技术专利分析报告.pdf
sprinmgboot实习管理系统-论文
资源包括: 1.Java爬虫实战代码 2.selenium学习笔记 3.代码演示视频 4.谷歌浏览器chrom115.0.5776.0 chrome-linux64.zip chrome-mac-arm64.zip chrome-mac-x64.zip chrome-win32.zip chrome-win64.zip 5.谷歌浏览器驱动器Chromedriver115.0.5776.0 chromedriver-linux64.zip chromedriver-mac-arm64.zip chromedriver-mac-x64.zip chromedriver-win32.zip chromedriver-win64.zip 特别说明:Chrome 为测试版(不会自动更新) 仅适用于自动测试。若要进行常规浏览,请使用可自动更新的标准版 Chrome。)
2024年全球电力评论-EMBER.pdf
2024嵌入式面试资料天元特通题.提取方式是百度网盘分享地址
毕业设计参考-基于SSM框架组合技术开发科研管理系统 使用SSM框架组合技术(Spring、SpringMVC和MyBatis)开发科研管理系统是一个综合性的项目,涉及后端开发、数据库设计和系统设计。以下是一个基于SSM框架的科研管理系统的毕业设计建议: ### 1. 需求分析 - **用户角色**:确定系统的主要用户角色,如研究人员、项目管理员、财务人员等。 - **核心功能**: - 项目管理:包括项目申请、项目审批、项目执行、项目结题等。 - 财务管理:包括预算申请、报销审批、财务报表等。 - 成果管理:包括论文发表、专利申请、奖项申报等。 - 资源管理:包括设备管理、图书资料管理等。 - 统计分析:对科研项目和成果进行统计分析,生成报表。 ### 2. 技术选型 - **前端**:HTML5、CSS3、JavaScript(可选框架如Bootstrap、Vue.js等)。 - **后端**:Java(Spring、SpringMVC)、MyBatis用于数据库操作。 - **数据库**:MySQL、Oracle或PostgreSQL等。 - **服务器**:
Swift 动画效果集合
图书借阅管理系统(第四组).zip
1_Parameter Manual NC variable and interface signals.pdf
2024嵌入式面试资料机试题2019大疆嵌入式笔试题A卷(附超详细解答)提取方式是百度网盘分享地址
智能汽车问卷调研系列一 车载显示引领座舱智能化,行业提质扩容在即
1、EMC由EMI和EMS组成 2、EMS常见的整改措施 3、干扰=共模干扰+差模干扰 4、元器件的摆放 5、缝隙影响
包含:地域、股票全称、 所属行业等字段
2024嵌入式面试资料驱动提取方式是百度网盘分享地址
tensorflow安装