美文网首页
iOS内存问题引起的野指针,signal SIGABRT,对象重

iOS内存问题引起的野指针,signal SIGABRT,对象重

作者: 我是Doki | 来源:发表于2020-04-30 17:59 被阅读0次

一、内存问题归类

1、野指针。 指针对象指向了无效的地址,这个地址被其它对象持有了,已经属于其它对象; 或者还有一种可能, 这块内存已经被 系统回收了。 总而言之, 指针指向的内存块不能用了,要么是被别人用了,要么是被系统回收了

2、Method cache corrupted. This may be a message to an invalid object, or a memory error somewhere else.  这其实也是内存问题的一种。 这个对象你明明申请了空间,现在却说你这个对象是个无效的对象,这说明你这个对象在创建的时候,占用的内存块有问题,在内存上发生了冲突。 举例: 你调用一个系统api,将一个结构体里的buffer数据,转为另一个结构体。 你在初始化目标结构体的时候,给结构体里的data申请了1024个字节,可是系统api中,有参数指定了要拷贝4000个字节的源结构体的data到目标结构体。 这个时候, 目标结构体就会多去占用2976个字节的空间,可是你却只申请了1024个字节,这样,当你程序在运行的时候,创建对象的时候,如果又去指向那多占的2976个内存空间, 就会出现对象无效。

3、 incorrect checksum for freed object - object was probably modified after being freed. 对象被释放后,又进行了修改。 

4、重复释放。 一个对象的内存已经被释放了一次,又再一次去释放。

总而言之;都是内存管理不当。

二、崩溃时的症状

内存问题肯定是导致app奔溃闪退的。 有以下几个特点:

1、崩溃的地方不固定,到处崩溃。 我们都知道,最好解决的bug就是问题在哪里就崩溃在哪里,直接定位到了有bug的代码。 可是内存问题却是到处崩溃,连平时的创建一个button的代码都可以崩溃。

2、崩溃日志不固定,这一次是说野指针,下一次是说无效对象,然后又说是对象释放后又发生了修改。

3、崩溃日志大多数是与内存有关。

总结:出现内存管理、泄露的问题大多发生在c,c++的代码处

三、解决思路

在前言里就说了,这里没有代码也没有具体的业务场景,主要是给猿友们增加一下对内存管理的认识,如果遇到了,希望我写的对你们有帮助!

首先我们肯定要定位有问题的代码块。 刚开始的时候,我考虑的是使用一些第三方工具或者崩溃日志,可使然并yuan,就算你看到了奔溃的日志,也不可以定位到有问题的代码。 第三方工具也是坑,没发现有效的。  这里,我是用的注释。 你app里应该是处理某一个业务或者发生点击事件的时候,崩溃了。这个时候,你在处理事件的地方,一点点的注释,直到定位代码块。

定位到具体的某一句代码后,沉下心去看这句代码做的事情,了解这句代码的用途。特别是去看申请内存方面的逻辑, 既然是内存问题,肯定是你在数据处理的时候,内存申请的不够,或者是申请的太大太大,超出了手机app所能承受的范围。

相关文章

网友评论

      本文标题:iOS内存问题引起的野指针,signal SIGABRT,对象重

      本文链接:https://www.haomeiwen.com/subject/qbstghtx.html