3
- (void)setFirstName:(NSString*)firstNameValue {
    [self willChangeValueForKey:@"firstName"];
    [firstName release];
    firstName = firstNameValue;
    [firstName retain];
    [self didChangeValueForKey:@"firstName"];
}

是对的吗?那么 willChange... foobar didChange... 块会导致 KVO 通知触发吗?

4

2 回答 2

12

不,您的实施并非 100% 正确。想想如果 firstName 当前设置为 NSString-instance 并且使用相同的实例调用 setter 会发生什么。首先,您将释放实例,然后设置实例变量,在这种情况下,它不会更改任何内容,然后您尝试保留实例,但到那时它很可能已经被释放了。

它应该是:

- (void)setFirstName:(NSString*)firstNameValue {
    [self willChangeValueForKey:@"firstName"];
    [firstNameValue retain];
    [firstName release];
    firstName = firstNameValue;
    [self didChangeValueForKey:@"firstName"];
}

或者:

- (void)setFirstName:(NSString*)firstNameValue {
    if (firstNameValue != firstName) {
        [self willChangeValueForKey:@"firstName"];
        [firstName release];
        firstName = firstNameValue;
        [firstName retain];
        [self didChangeValueForKey:@"firstName"];
    }
}

如果值没有真正改变,后一个版本具有不发送 oberserver-notifications 的额外优点。

于 2010-07-16T20:34:32.953 回答
0

的- 调用didChangeValueForKey:将通知所有观察者该值已更改。

于 2010-07-19T19:17:31.393 回答