NSManagedObject的managedObjectContext属性为nil

Sco*_*ets 5 iphone core-data nsmanagedobjectcontext

我正在尝试创建一个临时的托管对象上下文,在用户输入信息的几个屏幕之后,我将该上下文与主上下文合并(以确保没有插入"不完整"的对象).这是我创建临时上下文以及如何在其中插入对象的方法:

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);
}
Run Code Online (Sandbox Code Playgroud)

这是其中的一部分viewDidLoad.在控制台中,它显示托管对象上下文具有值.

然而,就在这个if语句之后(即使在内viewDidLoad,self.someManagedObject.managedObjectContext也是nil.我可以看到为什么局部变量不再可用(它只是超出范围),但是仍然应该设置托管对象的属性,对吧?

我知道我可以创建一个属性来存储托管对象上下文,但我宁愿让它以这种方式工作.

Sco*_*ets 15

我最近又遇到了同样的问题,虽然它处于不同的情况.我需要一个临时的托管对象上下文,与主要上下文完全分开,但是我再次遇到它在超出范围后消失的问题.这次我决定进一步调查,我最终意识到这managedObjectContext不是一种属性NSManagedObject,而是一种方法.这意味着以下两件事之一:

  1. 如果它在底层实现中使用属性,则该属性将不具有对上下文的强引用
  2. 如果以某种其他方式派生托管对象上下文,则它也不会保留对该上下文的强引用.

在任何一种情况下,上下文都没有强引用,超出范围,并且NSManagedObjects有一个nil managedObjectContext.

解决方案是通过为其创建强大的属性来简单地保持上下文.