Question

I have a subclass of NSManagedObject Class used with Core Data in iPhone. However, I have a temporary "field" (ivar) that I want to add in that Class (but I dont want to persist it in the data-store). Tried to use informal and formal protocol, but both of them give me a "static-variable" like behaviour. (It behaves like a Class Variable rather than Instance Variable). Any suggestion?

My first attempt, created Test "Dummy-class" which is supposedly a subclass of NSManagedObject, then I created Test-category

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

Those are the usual setter and getter. This is the way I use the 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

I could also mess with the NSManagedObject subclass (which is my Entity) directly but I dont think that is the way to do it.

Was it helpful?

Solution

You can't add an instance variable in the (in)formal protocol or in the category.

Any variable definition inside the category is treated as a variable definition at the file level outside the category, so it behaves like a class variable. It's a confusing behavior; I guess the compiler should warn about it.

The standard solution is to add the ivar which holds transient data (which does not persist in the database) in the subclass representing the entity directly, as in:

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

and then specifying MyEntity as the class in the Core Data Editor. Note that Core Data does not automatically save ivars in your custom NSManagedObject subclass; it only saves the properties specified in the Core Data model. So you can add as many book-keeping ivars as you want in your custom subclass.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top