ARC下KVO注意事项
程序员文章站
2022-06-24 23:54:07
...
假设我们对A ViewController(暂时叫AVC)进行的一个属性P进行KVO.那么在AVCdealloc的时候,removeKVO,是没有问题的.
但是,如果我们对AVC中的一个组件B的属性进行KVO,在 AVC dealloc的时候去remove KVO,就有一定概率crash,crash信息就是KVO没有被移除,对象B却已经释放了.
在MRC的时候,我们可以这样写AVC的dealloc:
我们手动管理B的释放,因此我们可以保证KVO的remove在B的release之前.这样完全不会有任何隐患.
但是ARC以后,我们不能手动控制B的release了,AVC的代码如下:
我们能做的事只有remove KVO.但是AVC的B组件的dealloc时机是不确定,有可能在执行到remove之前,B已经释放了.就会造成crash.
解决办法1:重写B组件的dealloc方法,保证KVO的移除在B的释放之前.
解决办法2:在AVC的appear和disappear方法里,加上KVO的监听和移除逻辑.
但是,如果我们对AVC中的一个组件B的属性进行KVO,在 AVC dealloc的时候去remove KVO,就有一定概率crash,crash信息就是KVO没有被移除,对象B却已经释放了.
在MRC的时候,我们可以这样写AVC的dealloc:
- (void)dealloc { //remove KVO here //release B here [super dealloc]; }
我们手动管理B的释放,因此我们可以保证KVO的remove在B的release之前.这样完全不会有任何隐患.
但是ARC以后,我们不能手动控制B的release了,AVC的代码如下:
- (void)dealloc { //remove KVO here }
我们能做的事只有remove KVO.但是AVC的B组件的dealloc时机是不确定,有可能在执行到remove之前,B已经释放了.就会造成crash.
解决办法1:重写B组件的dealloc方法,保证KVO的移除在B的释放之前.
解决办法2:在AVC的appear和disappear方法里,加上KVO的监听和移除逻辑.
下一篇: 海量数据处理问题(Top k问题)的实现