使用自定义设置器或KVO

时间:2014-11-01 14:47:21

标签: ios objective-c key-value-observing

我研究了这个话题已经有一段时间了。我仍然不确定为属性编写自定义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:

2 个答案:

答案 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
}