为 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 释放分配的上下文的主要内容,如果未能解决你的问题,请参考以下文章

在 segue 中使用类时遇到问题

为 segue 做准备,传递数据

将结果从 Swift 数组传递到 Segue 到描述

Receiver MainVIewController 没有 segue iOS

Swift - 通过 segue 传递值

segue didSelectRowAtIndexPath 无法传递字符串