いいえ、あなたの実装は 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 を送信しないという追加の利点があります。