iOS开发——调试技巧OC篇&EXC_BAD_ACCESS无处不在

EXC_BAD_ACCESS无处不在

这种错误可以说是每次写代码都会遇到的,所以如果是你你会怎么解决呢,如果不知道那么请往下看

EXC_BAD_ACCESS, objc_msgSend,

此类报错往往来的莫明奇妙.

原因往往是内存过度释放导致, 即多写了release;

至于是哪里多写了release, 很难查知, 以下及为查询方法.

出现这种情况, 也就是对指针对象的过度释放,导致次指针为野指针报错, (注意:如:[nil release] 操作空指针是不会报错的,在java中是有问题, [野指针 release] 报错  crash  很危险,)解决中bug,有很多中,暂时简单的说下几种简单的:


一: 在xcode中Run,Stop 右边也就是选择设备的地方左边找到

Scheme >Edit Scheme>Arguments>Environment Variables下添加

1. NSZombieEnabled               YES

2. MallocStackLoggingNoCompact  YES

3. MallocStackLogging                      YES

> ok

第一項 让系统把错误地址打印出来

第二項 可让xcode记录每个地址alloc的历史,这样我们就可以用命令把这个地址还原出来

第三項 可開啟MallocStack,就知道記憶體在程式運行中被配置的歷史


(注意:这个命令只支持gdb,必须把控制台的输出改成gdb,只支持模拟器,不支持真机调试)


二:在.m或者.mm文件中  直接添加打印最后日志文件 代码如下:

#ifdef
_FOR_DEBUG_

-
(BOOL)respondsToSelector:(SEL)rtSelector

{

NSString *className =
NSStringFromClass([self
class]) ;

NSLog(@"%@ -->
RTSelector:
%s",className,[NSStringFromSelector(rtSelector)UTF8String]);

return
[super
respondsToSelector:rtSelector];

}

#endif



三:找到模糊的地方,
断点调试, 或者打印标识 从大范围到小范围,

具体操作我这里就不多说了,根据项目的需求在对应代码行的左边点击就可以打断点



四:Leak的方式

  1. 打开Instruments工具:

    Xcode -> Open Developer Tool -> Instruments,

    选择Zombies类型.

  2. 重新启动运行Project, 先不要执行到崩溃点.

    在打开的Instruments工具中choose要检查的程序名称;

    然后点击Instruments左上角的record按钮, 开始记录内存使用情况.

  3. 继续执行程序至崩溃点.

    程序执行到第40秒报出zombie Messaged错误;

    点击图中圈选的">"查看内存详情.

  4. 分析内存调用详情:

    排除操作系统retain, release的部分,

    可知是由于CameraLiveViewController执行dealloc,

    对内存0x180d5420多调用了release.

  5. 综合以上结果:

    可知是存在于CameraLiveViewController中的一个UILabel多执行了release.

    此时可添加代码对CameraLiveViewController中的可疑UILabel打印日志.

    重新执行上述过程, 对比打印UILabel与Zobmie内存的地址,

    从而定位出错位置.

时间: 2024-10-15 17:53:27

iOS开发——调试技巧OC篇&EXC_BAD_ACCESS无处不在的相关文章

iOS开发调试技巧总结(持续更新中)

作者:乞力马扎罗的雪  原文 对于软件开发而言,调试是必须学会的技能,重要性不言而喻.对于调试的技能,基本上是可以迁移的,也就是说你以前在其他平台上掌握的很多调试技巧,很多也是可以用在iOS开发中.不同语言.不同IDE.不同平台的调试,有同性也有个性.今天我们就来学习一下iOS开发中的调试技巧,语言暂用为OC,IDE当然是强大的Xcode.首先说明下,Xcode已经为我们调试项目提供了极大的方便. [1.普通断点] 断点(Breakpoint)绝对是调试程序的第一大选择,也是掌握的基础技能.顾名

iOS开发——网络实用技术OC篇&网络爬虫-使用青花瓷抓取网络数据

网络爬虫-使用青花瓷抓取网络数据 由于最近在研究网络爬虫相关技术,刚好看到一篇的的搬了过来! 望谅解..... 写本文的契机主要是前段时间有次用青花瓷抓包有一步忘了,在网上查了半天也没找到写的完整的教程,于是待问题解决后抽时间截了图,自己写一遍封存在博客园中以便以后随时查阅. charles又名青花瓷,在iOS开发中的抓包中具有重要作用.最大的三点用处,一就是拦截别人软件的发送的请求和后端接口,练习开发.二是自己后端返回的response拦截修改后再接收以达到测试临界数据的作用.三写脚本重复拦截

ios开发——实用技术篇OC篇&iOS的主要框架

iOS的主要框架         阅读目录 Foundation框架为所有的应用程序提供基本系统服务 UIKit框架提供创建基于触摸用户界面的类 Core Data框架管着理应用程序数据模型 Core Graphics框架帮助你创建图形 Core Animation允许你创建高级的动画和虚拟效果 OpenGL ES 框架提供2D和3D绘图工具 将别的框架添加到工程里 本文是<Sunvey the Major Framworks>一文的翻译 框架是一个目录,这个目录包含了共享库,访问共享库里代码

iOS开发——网络编程OC篇&amp;(三)数据请求

一.GET请求和POST请求简单说明 创建GET请求 1 // 1.设置请求路径 2 NSString *urlStr=[NSString stringWithFormat:@"http://192.168.1.53:8080/MJServer/login?username=%@&pwd=%@",self.username.text,self.pwd.text]; 3 NSURL *url=[NSURL URLWithString:urlStr]; 4 5 // 2.创建请求对

iOS开发——数据持久化OC篇&amp;(三)对象归档

归档 iOS开发UI篇—ios应用数据存储方式(归档)  一.简单说明 在使用plist进行数据存储和读取,只适用于系统自带的一些常用类型才能用,且必须先获取路径相对麻烦: 偏好设置(将所有的东西都保存在同一个文件夹下面,且主要用于存储应用的设置信息) 归档:因为前两者都有一个致命的缺陷,只能存储常用的类型.归档可以实现把自定义的对象存放在文件中. 二.代码示例 1.文件结构 2.代码示例 YYViewController.m文件 1 // 2 // YYViewController.m 3 /

iOS开发——高级技术OC篇&amp;运行时(Runtime)机制

运行时(Runtime)机制 本文将会以笔者个人的小小研究为例总结一下关于iOS开发中运行时的使用和常用方法的介绍,关于跟多运行时相关技术请查看笔者之前写的运行时高级用法及相关语法或者查看响应官方文档. 下面就来看看什么是运行时,我们要怎么在iOS开发中去使用它. 官方介绍: 这里我们主要关注的是最后一种! 下面来看看Runtime的相关总结 #pragma mark 获取属性成员 /********************************************************

iOS开发——高级UI—OC篇&amp;退出键盘

退出键盘 iOS开发中键盘的退出方法用很多中我们应该在合适的地方使用合适的方法才能更好的提高开发的效率和应用的性能 下面给大家介绍几种最常用的键盘退出方法,基本上iOS开发中的键盘退出方法都是这几种中的一种活着几种. 一:textView 1 //通过委托来实现放弃第一响应者 2 #pragma mark - UITextView Delegate Method 3 -(BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(N

iOS开发——图形编程OC篇&amp;(一)Quartz 2D介绍

Quartz 2D介绍 一.什么是Quartz2D Quartz 2D是?个二维绘图引擎,同时支持iOS和Mac系统 Quartz 2D能完成的工作: 绘制图形 : 线条\三角形\矩形\圆\弧等 绘制文字 绘制\生成图片(图像) 读取\生成PDF 截图\裁剪图片 自定义UI控件 二.Quartz2D在iOS开发中的价值 为了便于搭建美观的UI界面,iOS提供了UIKit框架,??有各种各样的UI控件 UILabel:显?文字 UIImageView:显示图片 UIButton:同时显示图片和?字

iOS开发——网络编程OC篇&amp;(九)数据解析

数据解析 关于iOS开发的中数据解析的方法有两种JSON和XML,这里只做简单的介绍,会使用就可以了. JSON—— 关于JSON的解析经过很多爱好者的分析使用相同自带的还是最好的,不管是从使用的容易度还是性能方面 NSJSONSerialization 1 -(void)start 2 { 3 4 NSString* path = [[NSBundle mainBundle] pathForResource:@"Notes" ofType:@"json"]; 5