一般的なカスタムアクセサメソッドは、次のように記述できます。
- (NSString *)name
{
[self willAccessValueForKey:@"name"];
NSString *myName = [self primitiveName];
[self didAccessValueForKey:@"name"];
return myName;
}
- (void)setName:(NSString *)newName
{
[self willChangeValueForKey:@"name"];
[self setPrimitiveName:newName];
[self didChangeValueForKey:@"name"];
}
の意味は明らかですsetPrimitiveName
。これにより、KVCなしで「raw」変数にアクセスし(アクセサー内の実行ループを防止)、渡された値を設定できます。同じ観察結果をゲッターに適用できます。
setPrimitiveName
ドキュメントから、変更通知メソッドwillChangeValueForKey
と対応するメソッドが無効になっていることは明らかです。
今私の質問は次のとおりです:なぜあなたはそのメソッドを内部にラップする必要があるのwillChangeValueForKey:
ですdidChangeValueForKey:
か?
そこでコアデータプログラミングを読むと、次のように書かれています。
NSManagedObjectは、モデル化されたプロパティの自動Key-Value監視(KVO)変更通知を無効にし、プリミティブアクセサーメソッドはアクセスおよび変更通知メソッドを呼び出しません。モデル化されていないプロパティの場合、Mac OSXv10.4ではCoreDataは自動KVOも無効にします。Mac OS X v10.5以降では、CoreDataはNSObjectの動作を採用しています。
キー(アクセサーまたはインスタンス変数)にアクセスする準備ができていることを通知する必要があるのはなぜですか?誰に通知されますか?
私の質問が明確であることを願っています。前もって感謝します。