关于项目中遇到的对象持有问题

关于内存释放的问题

由于项目中的一些控制器被强引用导致无法释放,趁最近空闲于是抽点时间,过程中遇到一些很有趣的问题,特地记录下

  1. 首先就是bad_access的问题,打开僵尸模式之后控制台打印的是[xxx retain]: message sent to deallocated instance 0x7f8058b15a00,这个应该是向空对象发送了消息导致的,为什么出现这个问题呢,首先说下我的业务流程
object
object
object
第一界面A
第二界面B
第三界面C

从B获取对象到C进行修改,修改之后将对象带到A进行展示,并且点击之后会进到C,这个时候在修改这个对象的属性就会导致这个

2.那么既然复现了问题,怎么解决呢?首先我们先搞明白这个发送消息的对象是谁,因为可能情况是A和C持有了object这个对象,所以初步判断是A或C被释放导致的,A界面在流程中是不会被释放的,所以判断是C界面的问题,所以又走了一遍流程,打印出B跳到界面C时C对象的地址,然后对比崩溃的地址,发现是同一个

3.结论:object是C的一个属性,一直被C界面持有,当我们从C回调到A界面时,虽然C界面释放掉了,但是object被保存下来,指针仍指向被释放掉的C地址,所以当我们修改object的属性时,仍会向释放掉的C对象发送消息,导致程序崩溃

4.解决办法:C回调到A的时候,我们需要将对象copy一份到A,这样copy的对象就不会指向被释放的C地址了,如果object没有实现nscopying协议,需要进行实现才能copy

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值