对象失去其托管对象上下文
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 的技术支持,几乎尝试了所有方法。以上是关于对象失去其托管对象上下文的主要内容,如果未能解决你的问题,请参考以下文章