2011-03-24 29 views
3

我有简单的二传手一样简单的二传手仍然会产生变化值通知

- (void) setValue: (int) newVal 
{ 
    value = newVal; 
} 

其中valueint value;实例变量。

这怎么可能,使用[myobj setValue: 10];仍然生成通知观察员,尽管我的setter不做任何明确地通知(即它不叫willChangeValueForKey也不didChangeValueForKey)。

不知道它是否相关,但我使用普通的旧式Mac OS X.这在iOS上有什么不同吗?

回答

2

可可(和CocoaTouch)使用称为“isa-swizzling”的技术来支持自动KVO。

它通过动态继承观察对象的类来覆盖观察属性的setter。重写的方法的实现发送willChangeValueForKey:didChangeValueForKey:消息(当然,在它们之间调用原始实现)。

当设置观察对象时,对象的原始isa指针(指向对象的类)将被新的动态创建的子类替换。由于子类不会添加到对象的大小,所以这可能不会损害内存布局。

+0

有趣。这件事并不像人们想象的那么微不足道。谢谢。 – 2011-03-24 20:31:57

+0

请注意,isa-swizzling的东西是一个实现细节。当然有趣的东西,但不是你在实施过程中需要考虑的东西。 – bbum 2011-03-24 21:03:01

2

你可能要实现:

+ (BOOL)automaticallyNotifiesObserversForKey:(NSString *)theKey 

搜索这个苹果文档的志愿指南中,它会详细说明如何禁止自动KVO通知。

相关问题