0

iPhoneのCoreDataで使用されるNSManagedObjectクラスのサブクラスがあります。ただし、そのクラスに追加したい一時的な「フィールド」(ivar)があります(ただし、データストアに保持したくありません)。非公式および公式のプロトコルを使用しようとしましたが、どちらも動作のような「静的変数」を提供します。(インスタンス変数ではなくクラス変数のように動作します)。なにか提案を?

私の最初の試みは、おそらくNSManagedObjectのサブクラスであるTest "Dummy-class"を作成し、次にTest-categoryを作成しました。

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

それらは通常のセッターとゲッターです。これが私がTestクラスを使用する方法です

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サブクラス(私のエンティティ)を直接操作することもできますが、それがその方法だとは思いません。

4

1 に答える 1

4

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

カテゴリ内の変数定義は、カテゴリ外のファイル レベルの変数定義として扱われるため、クラス変数のように動作します。これは紛らわしい動作です。コンパイラはそれについて警告する必要があると思います。

標準的な解決策は、次のように、エンティティを表すサブクラスに一時データ (データベースに保持されない) を保持する ivar を直接追加することです。

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

MyEntity次に、Core Data Editor でクラスとして指定します。Core Dataは、ivar をカスタムサブクラスに自動的に保存しないことに注意してください。NSManagedObjectCore Data モデルで指定されたプロパティのみを保存します。そのため、カスタム サブクラスに簿記 ivar をいくつでも追加できます。

于 2010-11-28T14:05:10.760 に答える