2010-09-27 64 views
0

很多时候我遇到的情景时,我想观察一个保留的性质变化:有没有一种很好的方式来设置保留属性的KVO?

@interface AnObserver {…} 
@property(retain) Foo *foo; 

现在,当我想设置的观察,我需要写我自己的二传手,重复所有的样板二传手码:

- (void) setFoo: (Foo*) newFoo { 
    if (newFoo == foo) 
     return; 
    [foo removeObserver:self forKeyPath:…]; 
    [foo release], foo = [newFoo retain]; 
    [foo addObserver:self forKeyPath:…]; 
} 

这是愚蠢的,因为它污染了样板代码的来源,很容易漏掉一些东西。有没有更好的方式来设置保留属性的KVO?我希望我可以写下类似Mooseafter挂钩来更改属性更改后的KVO。

事实上,我意识到我可以看物业本身:

[self addObserver:self forKeyPath:@"foo"…]; 

,然后更改志愿时的财产变化:-),但我不知道这是要比手写的制定者更复杂我想避免。

想法?

回答

2

如何使用关键路径?假设您想要观察foovalue1value2属性的更改。您可以使用:

[self addObserver:self forKeyPath:@"foo.value1"]; 
[self addObserver:self forKeyPath:@"foo.value2"]; 

然后当这些属性发生变化时,您将收到通知。

+0

这似乎工作,谢谢! – zoul 2010-09-28 05:39:53