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

说在前面的话:

    写这个文章呢,主要是为了让遇到内存问题的猿友有个思路。 因为我最近遇到了内存方面的问题,很是头疼,奔溃,野指针,signal SIGABRT等各种奔溃日志,在app运行的时候,连简单的给控件设置图片也会崩溃。  这篇文章主要是说明以下三点:内存问题分为哪几类  奔溃时的症状 和 解决的思路。


一、内存问题归类

    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,对象重复释放)