问题如下:某ctrl的父类有一个Model类,model有个isPraised 是否点赞字段,当父类修改了isPraised时,要求子类修改页面展示。基于这么奇葩的实现方式,我想到一个方法,即在子类中,使用kvo检测model的isPraised的值的变化。于是子类添加代码如下:
- (void)setupObservers{
[self.product addObserver:self forKeyPath:@"isPraised" options:(NSKeyValueObservingOptionNew) context:nil];
}
这没什么问题。
但运行后,进入子Ctrl页面,然后退出,再进,程序崩溃了。注意,每次进该页面,都会重新创建。
报错几乎没有,直接死。怎么想也没想到原因。
后来在父类设置isPraised时,打断点,打印了下 Model对象的观察者。发现多了一堆。原来发现重复添加了观察者。
(lldb) po [self.product observationInfo]
<NSKeyValueObservationInfo 0x280be8060> (
<NSKeyValueObservance 0x280535770: Observer: 0x1036dbdb0, Key path: isPraised, Options: <New: YES, Old: NO, Prior: NO> Context: 0x0, Property: 0x280535f50>
<NSKeyValueObservance 0x28053eb80: Observer: 0x1036eafe0, Key path: isPraised, Options: <New: YES, Old: NO, Prior: NO> Context: 0x0, Property: 0x28053dce0>
)
(lldb)
解决方法 在dealloc中移除观察者
- (void)dealloc{
[self.product removeObserver:self forKeyPath:@"isPraise"];
}
网友评论