我已经阅读了有关KVO的apple documen t,它说:
观察者对象没有对观察对象的强引用。
我不能用removeObserver:forKeyPath:
方法调用dealloc
吗?它可以自动删除观察者吗?
最佳答案
您必须手动调用-removeObserver:forKeyPath:
。 iOS不会自动执行。
苹果说 does not maintain strong references to the observing object
。我认为这意味着,如果要为超出temp var范围的temp var移除RemoveObserver,则应将temp var设为ivar,以便维护ivar的强引用。
如果您不致电-removeObserver:forKeyPath:
。您将做出:1)泄漏
如您这样的代码:
[self addObserver:a forKeyPath:@"name" options:NSKeyValueObservingOptionNew context:nil];
如果您不致电
-removeObserver:forKeyPath:
。它将安慰:调试时,您会发现:
self
和a
没有泄漏。泄漏的是NSKeyValueObservationInfo object
如果您不致电
-removeObserver:forKeyPath:
。您将获得:2)中级类永不破坏&& Infinity通知正如苹果公司有关KVO的文件所述:
当您删除Observer时,如果未注册任何观察者,则中间类将销毁。而且,如果不调用removeObserver,则中间类将永远不会销毁,并且当您更改属性时,中间类的setter方法将继续发送通知。