コア データに関する私の理解では、プリミティブ アクセサーが機能するために必要なのは、プロパティ名の @dynamic ディレクティブだけです (エンティティ実装内でそのプロパティのプリミティブ アクセサーを宣言することも同様です)。
何らかの理由で、生成されたプリミティブ アクセサーを使用すると、setState: メソッドは状態プロパティを変更しません。
- (int)state
{
NSNumber * tmpValue;
[self willAccessValueForKey:@"state"];
tmpValue = [self primitiveState];
[self didAccessValueForKey:@"state"];
return [tmpValue intValue];
}
- (void)setState:(int)value
{
[self willChangeValueForKey:@"state"];
[self setPrimitiveState:[NSNumber numberWithInt:value]];
[self didChangeValueForKey:@"state"];
}
key-value-coding バージョンを使用すると、状態プロパティが変更されます
- (int)state
{
NSNumber * tmpValue;
[self willAccessValueForKey:@"state"];
tmpValue = [self primitiveValueForKey:@"state"];
[self didAccessValueForKey:@"state"];
return [tmpValue intValue];
}
- (void)setState:(int)value
{
[self willChangeValueForKey:@"state"];
[self setPrimitiveValue:[NSNumber numberWithInt:value] forKey:@"state"];
[self didChangeValueForKey:@"state"];
}
どちらの場合も、I プリミティブ アクセサーは次のように宣言されます (Apple の例とコード生成に従って):
@interface Post (CoreDataGeneratedPrimitiveAccessors)
- (NSNumber *)primitiveState;
- (void)setPrimitiveState:(NSNumber *)value;
@end
これがなぜなのか、私は少し途方に暮れています。どんな助けでも大歓迎です!