1

AppleのCoreDataUtilityチュートリアルでは、その効果を実装setNilValueForKey:してテストすることを推奨しています。

Key-Valueコーディングを使用して、プロセスIDをnilに設定します。ユーティリティをビルドして実行します。繰り返しますが、どうなりますか?そして最後に、setNilValueForKey:メソッドをコメントアウトして、もう一度テストします。

このコードでプロセスIDをnilに設定しようとしました[run setValue:nil forKey:@"processID"];が、これはを呼び出しませんsetNilValueForKey:。なぜだめですか?

これが私の実装です。追加したNSLogステートメントは表示されません。

- (void) setNilValueForKey:(NSString*)key {
    NSLog(@"setNilValueForKey: %@",  key) ;
    if ( [key isEqualToString:@"processID"] ) {
        [self setValue:@0  forKey:key ] ;
    }
    else {
        [super setNilValueForKey:key] ;
    }
}

私は同様のstackoverflowの議論を見つけましたが、誰もこの質問に答えません。

4

1 に答える 1

3

setNilValueForKey:動的に生成されたアクセサ メソッドが使用されている場合、 が呼び出されることはないようです。

"Run.m" の "processID" プロパティにカスタム セッター メソッドを提供する場合:

- (void)setProcessID:(NSInteger)processID
{
    [self willChangeValueForKey:@"processID"];
    [self setPrimitiveValue:@(processID) forKey:@"processID"];
    [self didChangeValueForKey:@"processID"];
}

それから

[run setValue:nil forKey:@"processID"]

呼び出される原因setNilValueForKey:

これは私が試行錯誤して経験したことであり、これに関する公式の参照はありません。しかし、「コア データ ユーティリティ チュートリアル」は Mac OS X 10.4 以降に存在し、動的に生成されるアクセサ メソッドは (私の知る限り) まだ存在していませんでした。そのため、10.5 用に更新されていない場所に関する部分が含まれている可能性があります。setNilValueForKey:しかし、それは私の側の純粋な推測です。

于 2012-12-15T13:26:49.283 に答える