所以我有两个视图控制器。视图控制器 A 连接到视图控制器 B。在视图控制器 A 的 prepareForSegue 中,它创建了一个新的托管对象上下文并将我的全局 UIManagedDocument 上下文分配为父上下文。然后,我使用子上下文创建一个新的托管对象,并将其分配给视图控制器 B 的强属性。
一旦 viewDidLoad 在视图控制器 B 中完成,托管对象仍然有效(这是我所期望的),但是这个新对象的托管对象上下文设置为零。
我知道下面的变量 *context 在 prepareForSegue 结束时超出了范围,但我希望全局父上下文保留子上下文,或者托管对象保留上下文本身。
这是我在视图控制器 A 中的 prepareForSegue 代码的略微修改版本。
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
UIViewController *vc = segue.destinationViewController;
if ([vc isKindOfClass:[ViewControllerB class]]) {
// Create new context and assign its parent
NSManagedObjectContext *mainContext = [myGlobalUIManagedDocument managedObjectContext];
NSManagedObjectContext *context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
context.parentContext = mainContext;
// Create new managed object using the context
NSManagedObject *objectB = [NSEntityDescription insertNewObjectForEntityForName:@"ObjectB" inManagedObjectContext:context];
// Pass the object to the destination view controller
ViewControllerB *vcB = (ViewControllerB *)vc;
vcB.strongManagedObjectProperty = objectB;
}
}
现在据我所知,视图控制器 B 中的任何代码都没有将上下文设置为 nil。我只是想知道,如果根据我提供的信息,一旦 prepareForSegue 失去作用域,*objectB 的托管对象上下文仍应为非零。如果是这样,我似乎还有更多的调试要做。
更新:我能够在视图控制器 B 中的 viewWillAppear 之后和 viewDidAppear 之前的某个时间跟踪我的上下文设置为 nil 的确切时刻。我完全糊涂了。