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 に答える