源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

iOS内存错误EXC_BAD_ACCESS的解决方法

  • 时间:2021-07-08 13:14 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:iOS内存错误EXC_BAD_ACCESS的解决方法
iOS开发,最郁闷的莫过于程序毫无征兆地就崩溃了,用bt命令打出调用栈,给出的是一堆系统EXC_BAD_ACCESS的信息,根本没办法定位问题出现在哪里。 首先说一下 EXC_BAD_ACCESS 这个错误,可以这么说,90%的错误来源在于对一个已经释放的对象进行release操作。举一个简单的例子来说明吧,首先看一段Java代码:
[u]复制代码[/u] 代码如下:
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,添加如下标记位,让系统把错误地址打印出来,如图: [b](通过Product->Scheme->Edit Scheme进入下面编辑页面,选中Arguments tab,增加标计位NSZombieEnabled设为YES)[/b] [img]http://files.jb51.net/file_images/article/201306/2013062321293548.jpg[/img] 这样,但崩溃出现,系统会出现以下提示信息: [b]2013-06-23 00:45:20.479 *** -[__NSArrayM addObject:]: message sent to deallocated instance 0x7179910[/b] [b]可见崩溃原因是内存地址0x7179910被重复释放了。[/b] Objective-C 这段代码有三个致命问题:1、内存泄露;2、错误释放;3、造成 EXC_BAD_ACCESS 错误。 如果崩溃是发生在当前调用栈,通过上面的做法,系统就会把崩溃原因定位到具体代码中。但是,如果崩溃不在当前调用栈,系统就仅仅只能把崩溃地址告诉我们,而没办法定位到具体代码,这样我们也没法去修改错误。这时就可以修改scheme,让xcode记录每个地址alloc的历史,这样我们就可以用命令把这个地址还原出来。如图:(跟设置[b]NSZombieEnabled[/b]一样,添加[b]MallocStackLoggingNoCompact[/b],并且设置为YES) [img]http://files.jb51.net/file_images/article/201306/2013062321293549.jpg[/img] 这样,当出现崩溃原因是[b]message sent to deallocated instance 0x7179910,我们可以使用以下命令,把内存地址还原:[/b] [b]info malloc-history 0x7179910[/b] [b]如图,这个命令能具体把这个地址在哪一行代码生成还原出来。[/b] [b][img]http://files.jb51.net/file_images/article/201306/2013062321293550.jpg[/img] [/b] [b](需要注意的是,因为这个命令只支持gdb,所以必须把控制台的输出改成gdb,并且有点遗憾的是,只支持模拟器,不支持真机调试)[/b] [b][/b] [img]http://files.jb51.net/file_images/article/201306/2013062321293551.jpg[/img] [b][/b] (同样是[b]通过Product->Scheme->Edit Scheme进入上面编辑页面,选中Info tab[/b]) [b]这样,好好检查一下那一行的代码,应该就很容易找出问题所在了。[/b]
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部