我研究了这个话题已经有一段时间了。我仍然不确定为属性编写自定义Setter是否是个好主意,或者是否有必要使用KVO。
我想要的是:
我有一个类MyInputBox
并且有一个名为maxCharCount的属性,当maxCharCount的值发生变化时,我想做点什么。所以要做到这一点,我使用:
@interface MyInputBox : UITextField
@property (nonatomic, assign) NSUInteger maxCharCount;
@end
然后在initialize方法中,我喜欢这样:
[self addObserver:self forKeyPath:@"maxCharCount" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context
{
if ([keyPath isEqualToString:@"maxCharCount"]){
[self setLabelWarningByDefaultText];
}
}
它比使用自定义Setter更好吗?
此外,如果我使用自定义Setter,我什么时候需要打电话
willChangeValueForKey:
和didChangeValueForKey:
答案 0 :(得分:1)
KVO相当慢,并且还涉及编写许多不太优雅的自定义代码。
在我看来,当您要触发的自定义代码位于定义属性的类中时,自定义setter更清晰,更易于编写。
当您想要观察在另一个对象属性中更改的值时,KVO非常有用。
除非在特殊情况下,我认为您不必担心在自定义setter中调用willChangeValueForKey和didChangeValueForKey。当使用属性getter和setter时,系统会为你调用这些方法。
我建议阅读Xcode文档中的“键值编码编程指南”一章。
答案 1 :(得分:0)
由于您的类是一个视图类,因此它更新自己的视图是有意义的。因此,我认为使用自定义设置器会更好。
KVO是一种低级机制,可以摆脱处理自己的Observer / Observable模式。对于其他对象来说,获取对象属性更改的通知非常有用。我没有看到任何物体观察其自身属性的价值。
如果您确实实施了自定义设置器,则不必自己致电willChangeValueForKey:
或didChangeValueForKey:
。设置实例变量就足够了
- (void)setMaxCount:(NSInteger)count {
_maxCount = count;
// Do any updates you want to do
}