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

时间:2014-09-04 17:57:23

标签: ios objective-c core-data

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

以下是我在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>

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

1 个答案:

答案 0 :(得分:0)

  

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

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

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