核心数据对象的生命周期和编译器优化

时间:2013-09-22 15:00:53

标签: ios xcode core-data

我有这两种辅助方法。通过Xcode中的优化级别设置为无(调试模式的默认设置),代码可以正常工作。但是,如果将“优化级别”设置为“无”以外的任何项,则testGetAllRecords中的日志将生成(null)。

为什么它的行为如此?我错过了什么吗?

(正在使用ARC)

+(NSArray *)getAllRecords
{
    NSError *error;
    CoreDataController *coreDataController = [[CoreDataController alloc]init];
    NSManagedObjectContext *context = [coreDataController managedObjectContext];
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Group1" inManagedObjectContext:context];
    [fetchRequest setEntity:entity];

    NSSortDescriptor *sortByName = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES selector:@selector(localizedCaseInsensitiveCompare:)];
    NSArray *sortDescriptors = [NSArray arrayWithObjects:sortByName, nil];
    [fetchRequest setSortDescriptors:sortDescriptors];

    NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];

    for (Group1 *aGroup in fetchedObjects)
    {
        // This produces valid data
        NSLog(@"getAllRecords name:%@", aGroup.name);
    }

    NSLog(@"getAllRecords currenthread: %@", [NSThread currentThread]);   //shown thread num = 1
    return fetchedObjects;
}
+(void)testGetAllRecords
{
    NSLog(@"testGetAllRecords currenthread: %@", [NSThread currentThread]);   //shown thread num = 1
    NSArray *allRecords = [DataStoreInterfaceWrapper getAllRecords];
    for (Group1 *aGroup in allRecords)
    {
        //This produces "(null)" when Xcode Optimization Level not set to None
        NSLog(@"testGetAllRecords name:%@", aGroup.name);
    }
}

1 个答案:

答案 0 :(得分:3)

在函数内部使用临时上下文这一事实意味着它在此函数结束时被释放,孤立所有与之连接的托管对象(将它们转换为具有nil上下文的错误)。

通过优化,当您的上下文不再保留(在函数结束时)时会立即发生这种情况,而在没有优化的情况下,在“调试”模式下,只要不再需要对象就不会释放它们点。

使用保留的上下文(一个比函数范围更长的上下文),一切都应该没问题。