关于内存释放的问题
由于项目中的一些控制器被强引用导致无法释放,趁最近空闲于是抽点时间,过程中遇到一些很有趣的问题,特地记录下
- 首先就是bad_access的问题,打开僵尸模式之后控制台打印的是[xxx retain]: message sent to deallocated instance 0x7f8058b15a00,这个应该是向空对象发送了消息导致的,为什么出现这个问题呢,首先说下我的业务流程
从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