2

NSManagedObject のカスタム ロジックをすべてカテゴリに配置して、モデルが変更された場合にモデルから標準クラスを再生成できるようにしました。

私が必要とするそのようなロジックの 1 つは、オブジェクトのプロパティの 1 つに対するカスタム セッターです。

- (void) setName:(NSString *)name
{
    [self willChangeValueForKey:@"name"];
    [self setPrimitiveValue:name forKey:@"name"];
    [self didChangeValueForKey:@"name"];
    NSLog(@"name was changed");//for example
}

これをカテゴリに入れました。この場合はItem+Custom.m

私の質問:

Item の名前を設定するたびにItem+Custom.m をインポートする必要がないのはなぜですか? 上記のログ ステートメントは引き続き発生します。

メッセージを送信するクラスが、ロジックを実行するためにカテゴリについて知る必要がないことに興味がありますか?

そして (おそらく別の問題) 同じオブジェクトの 2 番目のカテゴリに、別のログ ステートメントを持つ同じカスタム セッターを追加するとどうなるでしょうか?

4

1 に答える 1

4

プログラムがロードされると、すべてのカテゴリ メソッドがランタイムに認識されます。したがって、-[Item setName:]メソッドを宣言すると、Core Data は実行時にこのメソッドを作成しなくなります。

は、Xcode によって生成された管理対象オブジェクトのサブクラス ファイルでプロパティnameとして既に宣言されているため、何もインポートする必要はありません。@dynamic

2 つのカテゴリで同じメソッドが宣言されている場合、またはカテゴリで宣言されているメソッドの名前が元のクラスのメソッドと同じである場合、動作は未定義です

于 2013-02-28T21:08:59.760 に答える