2010-11-28 11 views
0

iPhoneのコアデータで使用されるNSManagedObjectクラスのサブクラスがあります。しかし、私はそのクラスに追加したい一時的な "フィールド"(ivar)を持っています(しかし、データストアで永続化したくありません)。非公式かつ正式なプロトコルを使用しようとしましたが、どちらも私に "静的変数"のような振る舞いを与えます。 (これは、インスタンス変数ではなくクラス変数のように動作します)。なにか提案を?NSManagedObjectサブクラスにivarを追加

おそらくNSManagedObjectのサブクラスでテスト「ダミー・クラス」を作成した私の最初の試みは、その後、私はテストカテゴリを作成し

@interface Test (custom) 
    NSString *_string ; 
    - (void)setString:(NSString *)newString; 
    - (NSString *)string; 
@end 

これらは通常のセッターとゲッターです。これは私が

テストクラスを使用する方法
Test *a = [[Test alloc] init]; 
Test *b = [[Test alloc] init]; 
[a setString:@"Test1"]; 
NSLog(@"%@", [a string]);   //This will print out Test1 

[b setString:@"Test2"];   
NSLog(@"%@", [b string]);   //This will print out Test2   
NSLog(@"%@", [a string]);   //Unfortunately, this will also print out Test2 

私が直接(私のエンティティである)NSManagedObjectのサブクラスで混乱もできたが、私はそれはそれを行う方法であると思ういけないです。

+0

コードのブロックを正しくレンダリングすることを歓迎します。簡単な方法があります:最初に空の行を挿入してから、コードの各行を4つ以上のスペースでインデントしてください! – Yuji

+0

ヒントありがとう – Rpranata

答えて

4

(in)正式なプロトコルまたはカテゴリにインスタンス変数を追加することはできません。

カテゴリ内の変数定義は、カテゴリ外のファイルレベルで変数定義として扱われるため、クラス変数のように動作します。それは混乱する行動です。私はコンパイラが警告しなければならないと思う。

標準溶液を同様に、直接エンティティを表すサブクラスで(データベース内に保持されません)一時データを保持IVARを追加することである。

@interface MyEntity:NSManagedObject{ 
     NSString*stringHoldingTransientSomething; 
} 
     ... 
@end 

、次いでクラスとしてMyEntityを指定しますコアデータエディタで。コアデータがカスタムNSManagedObjectサブクラスにivarsを自動的に保存しないことに注意してください。コアデータモデルで指定されたプロパティのみを保存します。したがって、カスタムサブクラスに必要な数のブックキャリングイarsを追加できます。

+0

Yap、正式で非公式なプロトコルのコンセプト説明のおかげで、私はコンパイラが開発者に警告すべきだと同意します。ありがとう – Rpranata

+0

しかし、モデルを変更した後に自動的にnsmanagedobjectサブクラスを作成すると、すべてのivarsが削除されます。それを回避する方法はありますか? – user1258240

+0

mogenerator http://raptureinvenice.com/getting-started-with-mogenerator/を使用してください。 – Yuji

関連する問題