Cocoa NSArray中的核心数据错误

Cocoa NSArray中的核心数据错误,cocoa,core-data,automatic-ref-counting,nsfetchrequest,xmppframework,Cocoa,Core Data,Automatic Ref Counting,Nsfetchrequest,Xmppframework,我有一个方法,可以执行NSFetchRequest以获取托管对象(特别是XMPPUserCoreDataStorageObjects)的数组。在performUserFetch返回数组之前,对象会正确地发生故障,我可以打印所有的显示名,但一旦我将数组返回到printUserInfo,对象就会进入故障状态,这不会是一个问题,除非核心数据不会将它们带回来 - (NSArray*)performUserFetch { NSManagedObjectContext *context = [[N

我有一个方法,可以执行NSFetchRequest以获取托管对象(特别是XMPPUserCoreDataStorageObjects)的数组。在performUserFetch返回数组之前,对象会正确地发生故障,我可以打印所有的显示名,但一旦我将数组返回到printUserInfo,对象就会进入故障状态,这不会是一个问题,除非核心数据不会将它们带回来

- (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);
}
我每5秒钟调用一次printUserInfo,结果数组在performUserFetch中是否正常,但printUserInfo中的所有内容都被清除,数组中的所有元素都已从内存中清除。这很好,但当我调用user.displayName时,故障没有得到解决,因此dn的值为null,用户的描述为

"<XMPPUserCoreDataStorageObject: 0x10219fd60> (entity: XMPPUserCoreDataStorageObject; id: 0x1021a3390 <x-coredata://324B9E93-BAD1-42B4-B7DB-2A62CA69BA13/XMPPUserCoreDataStorageObject/p127> ; data: <fault>)"
“(实体:XMPPUserCoreDataStorageObject;id:0x1021a3390;数据:)
有人能帮忙吗


(信息:10.7SDK,printUserInfo每5秒调用一次,并在ARC下运行)

只是猜测而已。有希望尝试以下方法

  • 不要每次都重新创建托管对象上下文。将其作为类的属性
  • 也许您还应该alloc/init数组,以确保内存保持分配状态。您也可以使用属性

  • 顺便说一句,另一种解决方案是使用
    NSFetchedResultsController
    。它被设计成在出现故障时特别可靠和高效。

    只是猜测而已。有希望尝试以下方法

  • 不要每次都重新创建托管对象上下文。将其作为类的属性
  • 也许您还应该alloc/init数组,以确保内存保持分配状态。您也可以使用属性

  • 顺便说一句,另一种解决方案是使用
    NSFetchedResultsController
    。它被设计为在出现故障时特别可靠和高效。

    托管对象不会自动保留其上下文。当
    -performUserFetch
    返回且
    上下文
    超出范围时,托管对象上下文将被垃圾收集。如果没有上下文,托管对象本身是无用的


    只要您需要使用那些
    XMPPUserCoreDataStorageObject
    实例,您就可以自己在某个地方保留上下文(正如Mundi所建议的那样)。

    托管对象不会自动保留其上下文。当
    -performUserFetch
    返回且
    上下文
    超出范围时,托管对象上下文将被垃圾收集。如果没有上下文,托管对象本身是无用的


    只要您需要使用这些
    XMPPUserCoreDataStorageObject
    实例,就可以将上下文保存在某个地方(正如Mundi所建议的那样)。NSFetchedResultsController在Cocoa中不存在,只存在于Cocoa Touch中。Mundi,非常感谢!你的解决方案1救了我一命,我快发疯了,现在我明白我需要将MOC保留为我的类的属性。NSFetchedResultsController在Cocoa中不存在,只存在于Cocoa Touch中。Mundi,非常感谢!你的解决方案1救了我一天,我快疯了,现在我明白我需要把MOC作为我的类的一个属性。只是好奇,我遇到了完全相同的问题。你解决过这个问题吗?你应该选择Mundi的答案作为答案只是好奇,我遇到了完全相同的问题。你解决过这个问题吗?你应该选择Mundi的答案作为答案