【发布时间】: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之间被删除是个谜。
标签: ios objective-c core-data