LoginSignup
25
25

More than 5 years have passed since last update.

NSManagedObjectの属性アクセサ作成は@synthesizeではなく@dynamic

Posted at

@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
25
25
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
25
25