在 migratePersistentStore: 到 OS X 10.9 Mavericks 上的另一个 URL 后访问 NSManagedObject 属性时崩溃

Posted

技术标签:

【中文标题】在 migratePersistentStore: 到 OS X 10.9 Mavericks 上的另一个 URL 后访问 NSManagedObject 属性时崩溃【英文标题】:Crash on accessing NSManagedObject property after migratePersistentStore: to another URL on OS X 10.9 Mavericks 【发布时间】:2014-02-19 19:12:19 【问题描述】:

在我将持久性存储迁移到另一个 URL 之前,我的代码在 OS X 10.9 上运行良好。当我尝试执行获取请求并按已获取项目的现有属性排序时,迁移应用程序崩溃后。在 OS X 10.8 上,它在迁移前后都可以正常工作。非常感谢任何帮助。

这是商店迁移,没什么花哨的:

    BOOL success = [storeCoordinator migratePersistentStore:store toURL:[NSURL fileURLWithPath:newPath] options:nil withType:NSSQLiteStoreType error:&error];

迁移成功进行,没有错误。 这是崩溃的代码(在迁移之前运行良好):

    NSManagedObjectContext *moc = [appDelegate managedObjectContext];

    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Item" inManagedObjectContext:moc];
    [request setEntity:entity];

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K == nil", @"parent"];
    [request setPredicate:predicate];

    // SORTING BY "sortOrder" PROPERTY CRASHES THE APP
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"sortOrder" ascending:YES];
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil]; 
    [request setSortDescriptors:sortDescriptors];

    NSError *error; 
    NSMutableArray *fetchResults = [moc executeFetchRequest:request error:&error];

崩溃详情:

Thread 1: EXC_BAD_ACCESS (code=1, address=0x60)

0x00007fff89a64ad0 in _propertyAtIndexForEntityDescription ()
0x00007fff89a631dd in snapshot_get_value_as_object ()
0x00007fff931ea49f in -[NSObject(NSKeyValueCoding) valueForKeyPath:] ()
0x00007fff931e904c in _sortedObjectsUsingDescriptors ()
0x00007fff931e8e69 in -[NSArray(NSKeyValueSorting) sortedArrayUsingDescriptors:] ()
0x00007fff89a459f0 in -[NSManagedObjectContext executeFetchRequest:error:] ()

更新 [2] 感谢汤姆哈灵顿的问题,我能够将问题缩小到这个:

更新 [3] 似乎有许多特定的键导致了这次崩溃。在获取的项目的十几个不同属性中,访问 NSDate'double' 类型的 3 个特定属性会导致应用程序崩溃。它们都有一些有意义的价值。

还有 NSString、Boolean、Integer 16、Integer 32Binary Data 类型的其他属性。其中一些是 nil,一些设置为默认值,一些具有其他值。可以毫无错误地访问它们。 并且有一个 NSDate 属性没有任何值,包括默认值,它也可以毫无问题地访问。

为什么会崩溃?在将商店迁移到另一个 URL 之前,我可以成功访问这些属性。

【问题讨论】:

那是完整的崩溃代码?我之所以问,是因为堆栈跟踪似乎表明排序存在问题,但您的示例代码没有使用任何排序描述符。 @TomHarrington 我实际上设置了排序描述符,我省略了它们,因为认为它不相关。请查看更新的代码。 @TomHarrington,是的,感谢您的鹰眼,问题出在 sortOrder 键上。当我在迁移后尝试以任何方式访问它时,甚至像 [item valueForKey:@"sortOrder"] 应用程序崩溃一样简单。还不明白为什么。 您不需要对迁移的商店做任何事情来完成这项工作。很遗憾,我目前没有任何其他建议。 @TomHarrington 谢谢。我能够进一步挖掘,当我尝试访问它们时,似乎有一组特定的属性导致应用程序在迁移后崩溃。非零 NSDate 和双精度值。 【参考方案1】:

似乎是不久前创建的特定项目的问题。可能在这些年里,项目文件和设置中出现了一些问题。

【讨论】:

你做了什么来使项目正确?把它扔了?我现在也有类似的问题。

以上是关于在 migratePersistentStore: 到 OS X 10.9 Mavericks 上的另一个 URL 后访问 NSManagedObject 属性时崩溃的主要内容,如果未能解决你的问题,请参考以下文章

核心数据:制作数据库的逐个对象副本

如何最好地将一个巨大的.sqlite数据库移动到旧的低内存iOS设备上的新目录中?

分配的变量引用在哪里,在堆栈中还是在堆中?

NOIP 2015 & SDOI 2016 Round1 & CTSC 2016 & SDOI2016 Round2游记

秋的潇洒在啥?在啥在啥?

上传的数据在云端的怎么查看,保存在啥位置?