@dynamic
はアクセサ作成をするわけではないので厳密に言うとタイトルは違うけど.
@synthesize
と@dynamic
の違いは基本的なポイントだけど,きちんと理解して使い分けないと思わぬところでハマる.
CoreDataを使うためにNSManagedObjectを継承した専用クラスを作ったとき,属性へのアクセサを作るためにヘッダに@property XXX;
,*.mに@dynamic XXX;
と書く.@dynamic
にするのはNSManagedObject
側で各属性のセッタ/ゲッタを作ってくれるから.
このとき@dynamic
ではなく@synthesize
としてしまうとCoreData用のアクセサ(-setValue:forKey:
)が使われず,普通のアクセサが作られる.
つまりNSManagedObjectを変更しているつもりが変更されず,CoreDataに編集データが保存されないというバグになる.一見挙動が同じように見える(値の編集や取得も出来ているように見える)分困る…
MyObj.h
#import <Foundation/Foundation.h>
@interface MyObj : NSManagedObject
@property (retain) NSString *name;
@end
MyObj.m
#import "MyObj.h"
@implementation MyObj
@dynamic title;
// @synthesize title; // <- NG!
@end