不,您的实施并非 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 的额外优点。