iOS内存错误EXC_BAD_ACCESS的解决方法
2016-08-02 11:33
323 查看
iOS开发,最郁闷的莫过于程序毫无征兆地就崩溃了,用bt命令打出调用栈,给出的是一堆系统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);
}
}
通常这样的崩溃出现,原因一般就是:调用了已经释放的内存空间,或者说重复释放了某个地址空间。而怎样定位到这个地址呢,可以通过编辑xcode的scheme,添加如下标记位,让系统把错误地址打印出来,如图:
(通过Product->Scheme->Edit Scheme进入下面编辑页面,选中Arguments tab,增加标计位NSZombieEnabled设为YES)
iOS开发,最郁闷的莫过于程序毫无征兆地就崩溃了,用bt命令打出调用栈,给出的是一堆系统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);
}
}
通常这样的崩溃出现,原因一般就是:调用了已经释放的内存空间,或者说重复释放了某个地址空间。而怎样定位到这个地址呢,可以通过编辑xcode的scheme,添加如下标记位,让系统把错误地址打印出来,如图:
(通过Product->Scheme->Edit Scheme进入下面编辑页面,选中Arguments tab,增加标计位NSZombieEnabled设为YES)
这样,当出现崩溃原因是message sent to deallocated instance 0x7179910,我们可以使用以下命令,把内存地址还原:
info malloc-history [b]0x7179910[/b]
如图,这个命令能具体把这个地址在哪一行代码生成还原出来。
根据上面的的步骤,我追踪问题,竟然我发现,我把本来该写成strong的属性误写成了assign,导致了提前释放,报错为message sent to deallocated instance 0x******
@property (nonatomic,assign)
NSNumber *fromDay;
(需要注意的是,因为这个命令只支持gdb,所以必须把控制台的输出改成gdb,并且有点遗憾的是,只支持模拟器,不支持真机调试)
(同样是通过Product->Scheme->Edit Scheme进入上面编辑页面,选中Info tab)
这样,好好检查一下那一行的代码,应该就很容易找出问题所在了。
复制代码代码如下:
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);
}
}
通常这样的崩溃出现,原因一般就是:调用了已经释放的内存空间,或者说重复释放了某个地址空间。而怎样定位到这个地址呢,可以通过编辑xcode的scheme,添加如下标记位,让系统把错误地址打印出来,如图:
(通过Product->Scheme->Edit Scheme进入下面编辑页面,选中Arguments tab,增加标计位NSZombieEnabled设为YES)
iOS开发,最郁闷的莫过于程序毫无征兆地就崩溃了,用bt命令打出调用栈,给出的是一堆系统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);
}
}
通常这样的崩溃出现,原因一般就是:调用了已经释放的内存空间,或者说重复释放了某个地址空间。而怎样定位到这个地址呢,可以通过编辑xcode的scheme,添加如下标记位,让系统把错误地址打印出来,如图:
(通过Product->Scheme->Edit Scheme进入下面编辑页面,选中Arguments tab,增加标计位NSZombieEnabled设为YES)
这样,当出现崩溃原因是message sent to deallocated instance 0x7179910,我们可以使用以下命令,把内存地址还原:
info malloc-history [b]0x7179910[/b]
如图,这个命令能具体把这个地址在哪一行代码生成还原出来。
根据上面的的步骤,我追踪问题,竟然我发现,我把本来该写成strong的属性误写成了assign,导致了提前释放,报错为message sent to deallocated instance 0x******
@property (nonatomic,assign)
NSNumber *fromDay;
(需要注意的是,因为这个命令只支持gdb,所以必须把控制台的输出改成gdb,并且有点遗憾的是,只支持模拟器,不支持真机调试)
(同样是通过Product->Scheme->Edit Scheme进入上面编辑页面,选中Info tab)
这样,好好检查一下那一行的代码,应该就很容易找出问题所在了。
相关文章推荐
- IOS 最全动画教程(基础)
- iOS项目加入iAD,Admob的简单代码
- NSString ios
- iOS 如何pop到指定页面
- 关于iOS使用FFmpeg直播rtsp流的一点记录
- gitOSCchina 版本管理
- 下拉刷新 ios
- ios 通知
- iOS——仿网易等的简单头部滚动
- iOS开发中三种简单的动画设置
- 本地存取 NSUserDefaults ios
- ios开发工具系列
- iOS 数字的格式化(NSNumber格式化)
- iOS开发从入门到精通--手动布局子视图
- iOS模拟器中图片在mac电脑中的实际位置
- iOS 时间轴相册 (配Demo下载)
- XZ_iOS之pch的使用
- 代理出现问题
- iOS崩溃日志分析
- 《Motion Design for iOS》(三十七)