当我想观察保留属性的变化时,我经常会遇到一个场景:
@interface AnObserver {…}
@property(retain) Foo *foo;
现在,当我想设置观察时,我需要编写自己的setter,重复所有样板设置器代码:
- (void) setFoo: (Foo*) newFoo {
if (newFoo == foo)
return;
[foo removeObserver:self forKeyPath:…];
[foo release], foo = [newFoo retain];
[foo addObserver:self forKeyPath:…];
}
这是愚蠢的,因为它用样板代码污染了源代码,很容易错过一些东西。有没有更好的方法在保留属性上设置KVO?我希望我可以写一些像Moose的after
钩子来更改属性后更改KVO。
事实上,我意识到我可以看到房产本身:
[self addObserver:self forKeyPath:@"foo"…];
然后在属性改变时更改KVO :-),但我确实意识到这比我想要避免的手写的setter要复杂得多。
想法?
答案 0 :(得分:2)
使用密钥路径怎么样?假设您要观察value1
的{{1}}和value2
属性的更改。你可以使用:
foo
然后,当这些属性发生变化时,您将收到通知。