内存优化-野指针优化

空指针    有指向任何东⻄ 的指针,即 nil、NULL、0 给空指针发送消息不会报错 

野指针    C 语⾔:声明⼀个指针变量,但是没有赋初始值,此时指针 指向⼀个垃圾值 ,即指向⼀块随机的内 存空间 OC语⾔:指针所指的对象已经被释放/回收了,但是指针没有作任何的修改,仍然 指向已经回收的

通过僵⼫对象检测的实现思路

1、通过OC中 Mehod Swizzling ,交换 根类NSObject和NSProxy 的 dealloc ⽅法为 ⾃定义 的dealloc ⽅法

2、为了 避免内存空间释放后被重写造成野指针 的问题,通过 字典存储被释放的对象 ,同时设置 在 30s后调⽤dealloc⽅法将字典中存储的对象释放,避免内存增⼤ 3、为了获取更多的崩溃信息,这⾥同样需要创建NSProxy的⼦类

僵⼫对象,是⼀种⽤来 检查内存错误(EXC_BAD_ACCESS)的对象 ,它可以捕获任何 尝试访问坏 内存的调⽤ 如果 给僵⼫对象发送消息 ,那么将在 运⾏期间崩溃 并输出错误⽇志,可以通过⽇志定位到野指针 对象调⽤的⽅法和类名

通俗来讲:僵⼫对象就是指⼀个 OC对象引⽤计数为0被释放 的对象,此时这个对象的 内存已经被系 统回收 ,该对象可能还存在,即数据依然在内存中,但是此时僵⼫对象已经不稳定了,

其内存可能 ⼀、⼏个概念区分 1、什么是野指针,什么是空指针 野指针 2、什么是 Zombie Object

触发野指针

1、开始处理对象

2、是否达到替换条件 根据监控策略,是否属于要检测的类 空间是否⾜够

3、如果符合条件,则获取对象,并解除引⽤,如果不符合则正常释放,即调⽤原来的dealloc ⽅法 4、向对象内填充数据 5、赋值僵⼫对象的类指针替换isa 6、对象+dealloc调⽤栈,保存在僵⼫对象中 7、根据情况是否清理内存和对象

野指针检测流程

1、开启野指针检测

2、设置监控到野指针时的回调block,在block中打印信息,或者存储堆栈

3、检测到野指针是否crash

4、最⼤内存占⽤空间

5、是否记录dealloc调⽤栈

6、监控策略 1)只监控⾃定义对象  2)⽩名单策略 3)⿊名单策略 4)监控所有对象

xcode设置 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值