Core Dataのモデルにメソッドを持たせる

今日 Qiitaで見つけた投稿がためになったのでメモ。

Core Dataにrailsのmodelみたいに自分で定義したmethodを作成する
http://qiita.com/items/d8d66ace518b25635e4e

Xcodeでは Editor > Create NSManagedObject Subclass... を選択すると .xcdatamodeld 形式のモデルからコードを自動的に生成してくれる。

f:id:questbeat:20130527214504p:plain

同じように New > File...Core Data > NSManagedObject subclass から作成することもできる。

f:id:questbeat:20130527214741p:plain

それ以降は .xcdatamodeld ファイルが変更される度に上記の手順でコードをリジェネレートするので、自動生成されたファイルに直接コードを書き足していくのは賢くない。

そんな時は、カテゴリを使ってメソッドを追加するのがいいらしい。
例えばこんな感じ。

Event+dateFormatter.h

#import "Event.h"

@interface Event (dateFormatter)

- (NSDateFormatter *)dateFormatter;

@end

Event+dateFormatter.m

#import "Event+dateFormatter.h"

@implementation Event (dateFormatter)

- (NSDateFormatter *)dateFormatter
{
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    dateFormatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";
    
    return dateFormatter;
}

@end

なるほど。今まではせっせと書き換えていたけど、カテゴリで追加する方がスマートだ。
まだ Core Data は使い始めたばかりなので、こういった情報はどんどん集めていきたいところ。

それよりも、ARCが有効なのに自動生成されるクラスのプロパティにretainが入ってしまうのはなんとかならないのだろうか。
あと、Orderedな一対多のリレーションを作った時に、自動生成されるメソッドが尽く失敗する現象もなんとかしてほしい。(一応修正する方法はある)