iOS内存错误EXC_BAD_ACCESS的解决方法

 更新时间:2013年06月23日 21:32:20   作者:  
iOS开发,最郁闷的莫过于程序毫无征兆地就崩溃了,用bt命令打出调用栈,给出的是一堆系统EXC_BAD_ACCESS的信息,根本没办法定位问题出现在哪里

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)

这样,但崩溃出现,系统会出现以下提示信息:

2013-06-23 00:45:20.479 *** -[__NSArrayM addObject:]: message sent to deallocated instance 0x7179910

可见崩溃原因是内存地址0x7179910被重复释放了。

Objective-C 这段代码有三个致命问题:1、内存泄露;2、错误释放;3、造成 EXC_BAD_ACCESS 错误。

如果崩溃是发生在当前调用栈,通过上面的做法,系统就会把崩溃原因定位到具体代码中。但是,如果崩溃不在当前调用栈,系统就仅仅只能把崩溃地址告诉我们,而没办法定位到具体代码,这样我们也没法去修改错误。这时就可以修改scheme,让xcode记录每个地址alloc的历史,这样我们就可以用命令把这个地址还原出来。如图:(跟设置NSZombieEnabled一样,添加MallocStackLoggingNoCompact,并且设置为YES)

这样,当出现崩溃原因是message sent to deallocated instance 0x7179910,我们可以使用以下命令,把内存地址还原:

info malloc-history 0x7179910

如图,这个命令能具体把这个地址在哪一行代码生成还原出来。

(需要注意的是,因为这个命令只支持gdb,所以必须把控制台的输出改成gdb,并且有点遗憾的是,只支持模拟器,不支持真机调试)

(同样是通过Product->Scheme->Edit Scheme进入上面编辑页面,选中Info tab)

这样,好好检查一下那一行的代码,应该就很容易找出问题所在了。

相关文章

  • IOS setOnclick点击事件分析

    IOS setOnclick点击事件分析

    本篇文章给大家整理了IOS setOnclick点击事件完美扩展的相关知识点以及代码实例,有需要的朋友可以跟着测试学习下。
    2018-05-05
  • 简介iOS开发中应用SQLite的模糊查询和常用函数

    简介iOS开发中应用SQLite的模糊查询和常用函数

    这篇文章主要介绍了iOS开发中应用SQLite的模糊查询和常用函数,SQLite是一个可作嵌入式的数据库非常适合小型应用使用,需要的朋友可以参考下
    2015-12-12
  • iOS 检测网络状态的两种方法

    iOS 检测网络状态的两种方法

    一般有Reachability和AFNetworking监测两种方式,都是第三方的框架,下文逐一详细给大家讲解,感兴趣的朋友一起看看吧
    2016-10-10
  • Xcode 8新特性的使用和遇到的坑

    Xcode 8新特性的使用和遇到的坑

    这篇文章主要介绍了Xcode 8新特性的使用和遇到的坑,非常不错具有参考借鉴价值,需要的朋友可以参考下
    2016-10-10
  • iOS抽屉效果开发案例分享

    iOS抽屉效果开发案例分享

    这篇文章主要为大家分享了iOS抽屉效果开发案例,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-04-04
  • iOS实现拖拽View跟随手指浮动效果

    iOS实现拖拽View跟随手指浮动效果

    这篇文章主要为大家详细介绍了iOS实现拖拽View跟随手指浮动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-02-02
  • iOS仿新闻tab标题栏效果

    iOS仿新闻tab标题栏效果

    这篇文章主要为大家详细介绍了iOS仿新闻tab标题栏效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-06-06
  • 删除xcode 中过期的描述性文件方法

    删除xcode 中过期的描述性文件方法

    下面小编就为大家分享一篇删除xcode 中过期的描述性文件方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-01-01
  • iOS开发中常见的解析XML的类库以及简要安装方法

    iOS开发中常见的解析XML的类库以及简要安装方法

    这篇文章主要介绍了iOS开发中常见的解析XML的类库以及简要安装方法,简要地说明了在Xcode下的一些特点以供对比,需要的朋友可以参考下
    2015-10-10
  • IOS自定义UIButton九宫格效果

    IOS自定义UIButton九宫格效果

    这篇文章主要介绍了IOS自定义UIButton九宫格效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-12-12

最新评论