Добавление ivar в подкласс NSManagedObject - PullRequest
0 голосов
/ 28 ноября 2010

У меня есть подкласс класса NSManagedObject, который используется с базовыми данными в iPhone. Однако у меня есть временное «поле» (ivar), которое я хочу добавить в этот класс (но я не хочу сохранять его в хранилище данных). Пытался использовать неформальный и формальный протокол, но оба они дают мне поведение, подобное «статической переменной». (Он ведет себя как переменная класса, а не как переменная экземпляра). Любое предложение?

Моя первая попытка, создал Test "Dummy-class", который предположительно является подклассом NSManagedObject, затем я создал Test-category

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

Это обычные сеттеры и геттеры. Так я использую Test class

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 (который является моей сущностью), но я не думаю, что это способ сделать это.

1 Ответ

4 голосов
/ 28 ноября 2010

Нельзя добавить переменную экземпляра в (в) формальном протоколе или в категории.

Любое определение переменной внутри категории обрабатывается как определение переменной на уровне файла вне категории, поэтомуон ведет себя как переменная класса.Это запутанное поведение;Я думаю, компилятор должен предупредить об этом.

Стандартным решением является добавление ivar, который содержит временные данные (которые не сохраняются в базе данных) в подкласс, представляющий сущность напрямую, как в:

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

, и затем указаниеMyEntity как класс в редакторе основных данных.Обратите внимание, что Core Data не автоматически сохраняет ivars в вашем подклассе NSManagedObject;он сохраняет только свойства, указанные в модели базовых данных.Таким образом, вы можете добавить столько учетных записей ivav, сколько захотите в свой пользовательский подкласс.

...