美文网首页
KVO使用遇到崩溃的问题

KVO使用遇到崩溃的问题

作者: 生命不止运动不息 | 来源:发表于2019-04-25 09:43 被阅读0次

    问题如下:某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"];
    }
    

    相关文章

      网友评论

          本文标题:KVO使用遇到崩溃的问题

          本文链接:https://www.haomeiwen.com/subject/wdxagqtx.html