3

我需要将 a 的内容临时存储NSManagedObject到字典中。因为核心数据有自己的内存管理程序,我不想保留任何指向NSManagedObject's 字段的强指针,此时只有值是感兴趣的(值在视图控制器之间传递,MOC 不同)。我也不能创建弱指针,因为我想控制内存回收何时完成。

我尝试了几件事,都失败了或不符合目的。

  1. 重复[[myNSMO alloc] initWithEntity:[NSEntityDescription entityForName:entity inManagedObjectContext:myNSMO.managedObjectContext] insertIntoManagedObjectContext:nil]; 它正在工作,但不适合我的应用程序设计(无需详细说明)

  2. NSDictionary从 中生成 a NSManagedObject,使用[myNSMO dictionaryWithValuesForKeys:<#(NSArray *)#>]。这不好,因为它返回一个包含 NSManagedObject 字段地址的字典。

  3. 使用copyWithZone创建一个NSDictionary填充每个键值,像这样 [myDictionary setObject:[myNSMO.field copyWithZone:nil] forKey:@"Key"]; 也不起作用,我仍然得到字段地址......

  4. 手动输入每个字段, [myDictionary setObject:[NSString stringWithFormat:@"%@",myNSMO.field ] forKey:@"Key"]; 这次很好,我确实获得了新的内存分配。但是手动编写代码非常耗时......

有人找到聪明的方法来做到这一点的机会吗?选项 1) 不起作用的原因是因为我将字典用作队列。我首先存储对象的副本,然后在需要时弹出条目。然后将该特定字典条目的副本返回到询问方法。问题是我无法创建NSManagedObject使用创建的副本[[...] insertIntoManagedObjectContext:nil];

有什么解决办法吗?

4

1 回答 1

9

在大多数意义上,保持指向托管对象字段的强指针是安全的——关系是特殊的,但日期、字符串和数字的实际 Foundation 对象是普通对象,如果您有强引用,它们将保留在内存中。

话虽如此,要创建包含实体所有属性的字典副本,您可以执行以下操作:

NSArray *properties = [[object entity] properties];
NSMutableDictionary *dictionaryRepresentation = [NSMutableDictionary dictionary];
for(NSAttributeDescription *attribute in properties)
{
    // we want only actual attributes, not relationships
    // or fetched properties
    if([attribute isKindOfClass:[NSAttributeDescription class]])
    {
        [dictionaryRepresentation
                 setObject:[object valueForKey:attribute.name]
                 forKey:attribute.name];
    }
}

因此,您正在使用托管对象公开其实体描述的事实,其中包括属性列表,将这些属性缩减为仅属性,然后使用键值编码来获取每个属性的当前值并最终插入它进字典。

如果出于某种原因你确实想要属性的副本——尽管,正如我所说,绝对没有理由这样做——你会copyautorelease如果你不使用 ARC)将每个属性插入到字典中。

于 2012-12-10T04:20:29.273 回答