概要
以前に(うっかり)NSManagedObject
を継承したクラスのプロパティに@dynamic
ディレクティブを付けるのを忘れてしまったのですが、
Property 'hoge' requires method 'hoge' to be defined - use @synthesize, @dynamic or provide a method implementation in this class implementation
というような警告は出たものの、プロパティの読み書き、永続化は問題なく実行できました。
@dynamic
、@synthesize
をどちらも省略した場合は@synthesize
を付けたときと同じように振る舞うはずなのに、
なぜこの警告が出るのか、また、なぜ@dynamic
を付けた場合と同様に問題なく振る舞うのか不明だったので調べてみました。
NS_REQUIRES_PROPERTY_DEFINITIONS
NS_CLASS_AVAILABLE(10_4,3_0) NS_REQUIRES_PROPERTY_DEFINITIONS
@interface NSManagedObject : NSObject {
@private
int32_t _cd_rc;
uintptr_t _cd_stateFlags;
id _cd_rawData;
id _cd_entity;
NSManagedObjectContext* _cd_managedObjectContext;
NSManagedObjectID* _cd_objectID;
uintptr_t _cd_extraFlags;
id _cd_observationInfo;
id* _cd_snapshots;
uintptr_t _cd_lockingInfo;
id _cd_queueReference;
}
NSManagedObject
のヘッダを見たところ上記のようになっており、
NS_REQUIRES_PROPERTY_DEFINITIONS
というマクロが使われています。
(NS_REQUIRES_PROPERTY_DEFINITIONS
はiOS6.0 で追加されたようです https://developer.apple.com/library/ios/releasenotes/General/iOS60APIDiffs/)
このマクロのコメントに書かれた説明によると、
// Marks classes that must specify @dynamic or @synthesize for properties in their @implementation (property getters & setters will not be synthesized unless the @synthesize directive is used)
-
NS_REQUIRES_PROPERTY_DEFINITIONS
を使うと@dynamic
または@synthesize
の記述が必用になる -
@synthesize
が書かれていない場合は getter も setter も生成されない
ということでした。
上記によりDynamic Method Resolutionの仕組みが働き、CoreData が動的に生成するアクセサが利用されるため、プロパティの読み書き、永続化は問題なく実行できた、ということのようです。