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下运行)
只是猜测。这将是有前途的尝试以下
- 不要每次重新创建一个托管的对象上下文。保持它作为你的班级的财产。
- 也许你还应该分配/初始化数组,以确保内存保持分配。你也可以使用一个属性。
的备选解决方案,顺便说一句,是使用
NSFetchedResultsController
。它被设计为在故障时特别可靠和高效。
只有在Cocoa Touch中,Cocoa中不存在NSFetchedResultsController。 – paulmelnikow 2012-02-09 03:07:23
对不起,我没有准确读取标签... – Mundi 2012-02-09 09:19:52
Mundi,非常感谢!你的解决方案1号节省了我的一天,我正在**疯狂**,现在我明白我需要保留MOC作为我班的财产。 – 2012-12-03 09:07:51
托管对象不会自动保留其上下文。当-performUserFetch
返回并且context
超出范围时,您的托管对象上下文将被垃圾收集。没有上下文,管理对象本身就没有用处。
只要您需要使用这些XMPPUserCoreDataStorageObject
实例,就可以在某处(如Mundi也建议)保留上下文。
只是好奇,我遇到了完全相同的问题。你有没有解决这个问题? – 2014-02-21 21:35:50
您应该选择Mundi的答案作为答案 – kdbdallas 2014-09-06 22:10:57