代码之家  ›  专栏  ›  技术社区  ›  Sophistifunk

你需要打电话给willChangeValueForKey:和didChangeValueForKey:?

  •  9
  • Sophistifunk  · 技术社区  · 14 年前

    我以为家常菜的主人应该是这样的:

    -(void) setFoo:(Foo *)newFoo {
    
      // Safeguards 
      // ...
    
      [self willChangeValueForKey:@"foo"];
      // Switcheroo
      // ...
      [self didChangeValueForKey:@"foo"];
    }
    

    但我在博客中看到了很多代码,这些代码来自那些比我做可可时间长得多的人,他们是这样写的:

    -(void) setFoo(Foo *)newFoo {
    
      // Safeguards 
      // ...
    
      // Switcheroo
      // ...
    }
    

    所以我的问题是,我们需要调用KVO通知方法吗?或者,如果您使用的是现代运行时,那么在更新私有iVar时,它是否神奇地完成了呢?

    1 回复  |  直到 14 年前
        1
  •  14
  •   herzbube    12 年前

    除非你选择退出,否则一切都很神奇。阅读 this section KVO指南。请注意,KVC/KVO自古以来就存在(即在引入 @property )所以不管塞特是不是 @synthesize 不管是不是。它甚至与旧的/新的运行时二分法无关。

    这个魔法的细节(isa swizzling)在一个 blog post 作者:迈克·阿什。这很神奇。基本上,当观察到一个键时,运行时会自动替换setter的实现,以便调用KVO通知。