对象失去其托管对象上下文

Posted

技术标签:

【中文标题】对象失去其托管对象上下文【英文标题】:object loosing its managed object context 【发布时间】:2014-09-04 17:57:23 【问题描述】:

我有一个类,我在其中将某个实体的NewObject 插入到托管对象上下文中。托管对象上下文直接从应用程序的委托中检索,也是一个“强”属性。

这是我在 parentViewController 中创建实体的方式

_userPerformanceRecord = [NSEntityDescription insertNewObjectForEntityForName:@"KRUserPerformance" inManagedObjectContext:[_gAppData managedObjectContext]];

现在根据我的任务,我必须将此对象传递给一个新的视图控制器,在那里我将对其值进行一些更改,然后最后将其保存到数据库中。

现在这里是视图的生命周期方法中发生的事情。

init method
        NSLog(@"init : Object context for record %@", _userPerformanceRecord.managedObjectContext);

viewDidLoad
    NSLog(@"load : Object context for record %@", _userPerformanceRecord.managedObjectContext);

viewWillAppear
    NSLog(@"will appear : Object context for record %@", _userPerformanceRecord.managedObjectContext);

viewDidAppear
    NSLog(@"appear : Object context for record %@", _userPerformanceRecord.managedObjectContext);
    NSLog(@"Default Managed Object Context: %@",[_gAppData managedObjectContext]);

在这些生命周期方法中没有发生任何其他事情,这会影响这个实体 _userPerformanceRecord。

输出如下

2014-09-04 13:46:01.957 myApp[5404:60b] init : Object context for record <NSManagedObjectContext: 0x15670eb0>
2014-09-04 13:46:01.958 myApp[5404:60b] <NSManagedObjectContext: 0x15670eb0>
2014-09-04 13:46:02.037 myApp[5404:60b] check perf : Object context for record <NSManagedObjectContext: 0x15670eb0>
2014-09-04 13:46:02.047 myApp[5404:60b] load : Object context for record <NSManagedObjectContext: 0x15670eb0>
2014-09-04 13:46:02.048 myApp[5404:60b] will appear : Object context for record <NSManagedObjectContext: 0x15670eb0>
2014-09-04 13:46:02.764 myApp[5404:60b] appear : Object context for record (null)
2014-09-04 13:46:02.764 myApp[5404:60b] Default Managed Object Context: <NSManagedObjectContext: 0x15670eb0>

所以现在如果你观察输出,你会发现实体的 managedObjectContext 存在直到 viewWillAppear 但在 viewDidAppear _userPerformanceRecord 正在失去它的 managedObjectContext,但是如果我从 app 委托中获取原始的 managedObjectContext,它仍然存在于内存中,只是关联带有实体的 managedObjectContext 正在丢失。我不知道如何通过视图的生命周期方法,对象 managedObjectContext 会丢失。只是要补充一点,在这一切之后,_userPerformanceRecord 确实仍然存在于内存中。

【问题讨论】:

当对象从上下文或存储中删除或移除时会发生这种情况,但您仍保留对它的引用。 不应该被删除,里面没有deleteObject之类的东西,而且为什么在didAppear和willAppear之间被删除是个谜。 【参考方案1】:

在这些生命周期方法中没有发生任何其他事情,这会影响这个实体 _userPerformanceRecord。

也许,但您的托管对象可能正在发生其他事情。我建议也记录对象本身(托管对象上下文可能是nil,因为对象是nil

这也可能与您设置 ivar 的方式有关。尝试访问self.object 而不是_object。请显示您分配对象的 ivar 声明和状态。首选位置是prepareForSegue

【讨论】:

它不是一个基于故事板的项目,它有简单的导航控制器,我使用 pushViewController 进行相同的自定义初始化方法,在函数中传递变量(它是一个旧项目,自 ios 5 以来一直存在) .我检查了_userPerformanceRecord,它不是零,它在内存中。另外,当我拥有对象的内存但托管对象上下文不存在时,使用 _object 或 self.object 访问属性会有什么不同。我将为此使用 Apple 的技术支持,几乎尝试了所有方法。

以上是关于对象失去其托管对象上下文的主要内容,如果未能解决你的问题,请参考以下文章

托管对象上下文未保存到持久存储

合并托管对象上下文的方法

共享托管对象上下文

批量更新后更新托管对象上下文中的托管对象

在托管对象上下文之间传递对象

核心数据:我的托管对象上的托管对象上下文为零