gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 19:07:14 25 4
gpt4 key购买 nike

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

最佳答案

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

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

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

关于ios - 核心数据对象的生命周期和编译器优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18945193/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com