ARC下KVO注意事项

阅读更多
假设我们对A ViewController(暂时叫AVC)进行的一个属性P进行KVO.那么在AVCdealloc的时候,removeKVO,是没有问题的.
但是,如果我们对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的监听和移除逻辑.

你可能感兴趣的:(ARC下KVO注意事项)