1

我有这两个辅助方法。将 Xcode 中的优化级别设置为无(调试模式的默认设置),代码可以正常工作。但是,如果优化级别设置为 None 以外的任何值,则 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);
    }
}
4

1 回答 1

3

您在函数内使用临时上下文这一事实意味着它在此函数结束时被释放,从而孤立与其连接的所有托管对象(将它们变为具有 nil 上下文的故障)。

随着您的优化,当您的上下文不再保留时(在函数结束时),这会立即发生,而在没有优化和“调试”模式下,您的对象不会在不再需要时立即释放。

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

于 2013-09-22T17:17:02.293 回答