2011-07-14 190 views
0

让我做一个例子来说明这一点:对观察员的观察员观察员是否会发生任何变化?

我有一个类ClassA的,它包含一个公共成员memberA。 它还包含一个公共方法methodA,它将更改memberA的值。

现在我有ClassA的一个瞬间:

instantA 

然后我把这个:

[instantA addObserver:anObserver forKeyPath:@"memberA" options:NSKeyValueObservingOptionNew context:NULL]; 

为什么这会触发观察员:

instantA.memberA = xxxxx; 

但这不会:

[instantA methodA]; 

回答

0

这是因为编译器为您的属性生成的合成方法与KVO兼容,但您的手动更改的方法可能不适用。

我猜你的方法是直接改变iVar,而不是通过属性?

举例来说,你这样做......

- (void)methodA 
{ 
    memberA = someValue; 
} 

或者是你这样做......

- (void)methodA 
{ 
    self.memberA = someValue; 
} 

后者将引发观察者,前者不会。您可以通过它遵循志愿使前者触发观察者......

- (void)methodA 
{ 
    [self willChangeValueForKey:@"memberA"]; 
    memberA = someValue; 
    [self didChangeValueForKey:@"memberA"]; 
} 

看到苹果的官方文档here对志愿遵守的更多信息。

+0

谢谢你,你真棒! – CarmeloS