Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

NSManagedObject's managedObjectContext property is nil

I'm trying to create a temporary managed object context, and after a few screens of the user putting in information, I merge that context with the main context (to ensure that there are no "incomplete" objects are inserted). This is how I create my temporary context and how I insert an object in it:

if (!self.someManagedObject) {

    NSManagedObjectModel *model = [NSManagedObjectModel mergedModelFromBundles:@[[NSBundle mainBundle]]];
    NSPersistentStoreCoordinator *storeCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];
    [storeCoordinator addPersistentStoreWithType:NSInMemoryStoreType configuration:nil URL:nil options:nil error:nil];

    NSManagedObjectContext *managedObjectContext = [[NSManagedObjectContext alloc] init];
    [managedObjectContext setPersistentStoreCoordinator:storeCoordinator];

    self.someManagedObject = [NSEntityDescription insertNewObjectForEntityForName:@"SomeObject" inManagedObjectContext:managedObjectContext];
    NSLog(@"%@", self.someManagedObject.managedObjectContext);
}

This is a part ofviewDidLoad. In the console it shows that managed object context has a value.

However, right after this if statement (even within viewDidLoad, self.someManagedObject.managedObjectContext is nil. I can see why the local variable would not be available anymore (it simply goes out of scope), but the managed object's property should still be set, right?

I know I can create a property to store the managed object context, but I'd rather get it to work this way.

like image 584
Scott Berrevoets Avatar asked Aug 02 '12 23:08

Scott Berrevoets


1 Answers

I recently ran into the same problem again, although it was in a different situation. I needed a temporary managed object context, completely separate from the main one, but I again ran into the problem of it disappearing after it goes out of scope. This time I decided to investigate further, and I ultimately realized that managedObjectContext is not a property of NSManagedObject, but a method. This means one of two things:

  1. If it uses a property in the underlying implementation, that property will not hold a strong reference to the context
  2. If the managed object context is derived in some other way, it will also not hold a strong reference to that context.

In either case, the context has no strong references, goes out of scope, and the NSManagedObjects have a nil managedObjectContext.

The solution was to simply keep the context around by creating a strong property for it.

like image 55
Scott Berrevoets Avatar answered Oct 10 '22 02:10

Scott Berrevoets