LoginSignup
1
1

More than 5 years have passed since last update.

NSManagedObject を継承したクラスのプロパティで @dynamic を省略した場合の挙動

Last updated at Posted at 2015-08-20

概要

以前に(うっかり)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 が動的に生成するアクセサが利用されるため、プロパティの読み書き、永続化は問題なく実行できた、ということのようです。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1