NSManagedObjects 数组在将其传递给另一个方法后具有空值

Posted

技术标签:

【中文标题】NSManagedObjects 数组在将其传递给另一个方法后具有空值【英文标题】:Array of NSManagedObjects has null values in it after passing it to another method 【发布时间】:2013-09-30 19:26:15 【问题描述】:

在我的应用程序中,我将 MagicalRecord 用于 CoreData 堆栈,并且我遇到了 NSManagedObject 的奇怪行为。我的 DB 类中有这个方法,它从 DB 中获取 Stuff 实体的所有条目。我从另一个类调用这个方法,在这个 getStuff 方法中,我得到了正确的值,这些值在下面的日志语句中打印出来。

-(NSArray*) getStuff

    NSManagedObjectContext * managedObjectContext = [NSManagedObjectContext MR_contextWithStoreCoordinator:self.psc];

    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Stuff"];

    NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"idNumber" ascending:YES];

    [request setSortDescriptors:[NSArray arrayWithObjects:sort, nil]];

    NSError *error = nil;
    NSArray *arr = [managedObjectContext executeFetchRequest:request error:&error];

    for (Stuff *stuff in arr) 
         NSLog(@"stuff fN: %@",stuff.idNumber);
    

    if (arr)
       return arr;

    return [NSArray array];

但是,此方法返回给另一个类的数组包含所有这些对象,其中包含 null 值。

// -- some othe class
// call DB to check if we have stuff there
NSArray* stuff = [database getStuff];

for (Stuff *stuff in stuff) 
         NSLog(@"stuff fN: %@",stuff.idNumber);
    

有谁知道为什么会这样?!非常感谢任何形式的帮助!

【问题讨论】:

【参考方案1】:

您的getStuff 方法创建了一个新的NSManagedObjectContext,它(假设您使用ARC 编译)在方法结束时被释放。托管对象“活”在创建它们的上下文中。在释放上下文后访问它们的属性不起作用。

【讨论】:

这真的很有帮助。解决了我的问题,谢谢马丁【参考方案2】:

假设您使用 MagicalRecord 设置 CoreData 堆栈,您可以使用 [NSManagedObjectContext MR_contextForCurrentThread] 而不是 [NSManagedObjectContext MR_contextWithStoreCoordinator:self.psc]

【讨论】:

我曾经使用它,但问题是我必须管理两个不同的存储 (DB),这就是为什么我使用 [NSManagedObjectContext MR_contextWithStoreCoordinator:self.psc] 来区分我打电话的商店。你知道我可以用不同的方式做到这一点吗?! 啊,那样……那我恐怕你需要用 CoreData 重新设计你的工作了。正如@Martin R 提到的,使用ARC,您的上下文在getStuff 结束时被释放。您需要在使用其对象的范围内保持对上下文的强引用。如果是类 - 将上下文设为类的属性,并使用该类的 init 中的存储协调器对其进行初始化。如果对象(及其上下文)在类之间共享,请考虑创建保持上下文的单例,例如在 contextOfDB1contextOfDB2 属性中。 不要再使用 contextForCurrentThread 了。它已损坏,已弃用,并将在 MagicalRecord 的下一个版本中消失

以上是关于NSManagedObjects 数组在将其传递给另一个方法后具有空值的主要内容,如果未能解决你的问题,请参考以下文章

如何在 STL 中使用指向向量的指针,就像我们在将数组地址传递给另一个函数时将指针分配给数组一样?

将 Javascript 数组转换为 PHP 数组或将其传递给 PHP 文件

保留关联 PHP 数组的顺序,同时通过 ajax 将其传递给 javascript

将多维数组传递给函数 C

Android - 将搜索传递给片段

如何将 C# 中的二维数组传递给 C++ DLL?