欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

ARC下KVO注意事项

程序员文章站 2022-06-24 23:50:31
...
假设我们对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的监听和移除逻辑.