2011-07-14 231 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