NSArray核心数据错误

问题描述:

我有一个方法执行一个NSFetchRequest来获得一个托管对象(特别是XMPPUserCoreDataStorageObjects)的数组。这些对象在performUserFetch返回数组之前正确地错误,并且我可以打印所有的displayNames,但是一旦将数组返回给printUserInfo,对象就会进入故障状态,除了Core Data不会带来问题外他们回来!NSArray核心数据错误

- (NSArray*)performUserFetch 
{ 
    NSManagedObjectContext *context = [[NSManagedObjectContext alloc] init]; 
    [context setPersistentStoreCoordinator:[xmppRosterStorage persistentStoreCoordinator]]; 
    [context setUndoManager:nil]; 
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"XMPPUserCoreDataStorageObject" inManagedObjectContext:context]; 

    NSSortDescriptor *sd1 = [[NSSortDescriptor alloc] initWithKey:@"sectionNum" ascending:YES]; 
    NSSortDescriptor *sd2 = [[NSSortDescriptor alloc] initWithKey:@"displayName" ascending:YES]; 

    NSArray *sortDescriptors = [NSArray arrayWithObjects:sd1, sd2, nil]; 

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
    [fetchRequest setEntity:entity]; 
    [fetchRequest setSortDescriptors:sortDescriptors]; 
    [fetchRequest setReturnsObjectsAsFaults:NO]; 
    NSError *err; 

    NSArray *result = [context executeFetchRequest:fetchRequest error:&err]; 
    return result; 

} 

- (void)printUserInfo 
{ 
    NSArray *result = [self performUserFetch]; 
    for(XMPPUserCoreDataStorageObject *user in result) 
    { 
     NSString *dn = user.displayName; 
     NSLog(@"Display name = %@", dn); 
    } 
     NSLog(@"%@",result); 
} 

我打电话printUserInfo每5秒,并在performUserFetch如果结果数组精细,但一切都已经走了锅在printUserInfo,以及阵列中的所有元素已经从内存中清除。这将是很好,但是当我打电话user.displayName该故障并没有解决,所以DN具有null值,并且用户的描述是

"<XMPPUserCoreDataStorageObject: 0x10219fd60> (entity: XMPPUserCoreDataStorageObject; id: 0x1021a3390 <x-coredata://324B9E93-BAD1-42B4-B7DB-2A62CA69BA13/XMPPUserCoreDataStorageObject/p127> ; data: <fault>)" 

谁能帮助?

(信息:10.7 SDK,printUserInfo被称为每隔5秒,ARC下运行)

+0

只是好奇,我遇到了完全相同的问题。你有没有解决这个问题? – 2014-02-21 21:35:50

+0

您应该选择Mundi的答案作为答案 – kdbdallas 2014-09-06 22:10:57

只是猜测。这将是有前途的尝试以下

  1. 不要每次重新创建一个托管的对象上下文。保持它作为你的班级的财产。
  2. 也许你还应该分配/初始化数组,以确保内存保持分配。你也可以使用一个属性。

的备选解决方案,顺便说一句,是使用 NSFetchedResultsController。它被设计为在故障时特别可靠和高效。

+0

只有在Cocoa Touch中,Cocoa中不存在NSFetchedResultsController。 – paulmelnikow 2012-02-09 03:07:23

+0

对不起,我没有准确读取标签... – Mundi 2012-02-09 09:19:52

+1

Mundi,非常感谢!你的解决方案1号节省了我的一天,我正在**疯狂**,现在我明白我需要保留MOC作为我班的财产。 – 2012-12-03 09:07:51

托管对象不会自动保留其上下文。当-performUserFetch返回并且context超出范围时,您的托管对象上下文将被垃圾收集。没有上下文,管理对象本身就没有用处。

只要您需要使用这些XMPPUserCoreDataStorageObject实例,就可以在某处(如Mundi也建议)保留上下文。