为 segue 中传递的新 nsmanagedobject 释放分配的上下文
Posted
技术标签:
【中文标题】为 segue 中传递的新 nsmanagedobject 释放分配的上下文【英文标题】:Assigned context gets released for new nsmanagedobject passed in segue 【发布时间】:2013-02-21 02:54:43 【问题描述】:所以我有两个视图控制器。视图控制器 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 的确切时刻。我完全糊涂了。
【问题讨论】:
我不是 Core Data 专家,但您是否尝试过将上下文传递给视图控制器 B,然后在视图控制器 B 中创建新的 NSManagedObject? 您如何访问视图控制器 B 中的子上下文? @geraldWilliam - 这就是我之前的做法......传递上下文和 nsmanagedobjectID。我只是认为传递托管对象将是一种更清洁的方法。感谢您的建议。 @Rakesh - 我从不直接访问它。我只是使用 viewDidLoad 中的托管对象分配了几个网点。 我经历了确切的事情——在 viewControllers 之间传递 managedObject,并且对象丢弃了 viewWillAppear 和 viewDidAppear 之间的上下文。很奇怪。 【参考方案1】:我从来没有真正弄清楚这里发生了什么。
我的解决方案是在我的名为 editingContext 的单例类上创建一个 UIManagedObjectContext 属性来管理我的 UIManagedDocument。它负责创建一个上下文作为 UIManagedDocument 主上下文的子级,并将其存储在自己的属性中。
因此,当我将上下文传递给视图控制器 B 时,上下文不会设置为 nil。当我完成上下文后,我只需向我的单例发送一个 checkinContext: 方法以释放编辑上下文。
有点骇人听闻,但我可以将这种方法与我所有的 segues 一起使用,并获得一个“scratch”上下文的好处,如果用户取消他们的操作,我可以丢弃它。
【讨论】:
以上是关于为 segue 中传递的新 nsmanagedobject 释放分配的上下文的主要内容,如果未能解决你的问题,请参考以下文章