创建NSManagedObject的副本

时间:2012-12-10 00:57:26

标签: ios core-data nsdictionary nsmanagedobject

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

我尝试了一些事情,都失败了或者不符合目的。

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

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

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

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

  5. 有人找到聪明的方法吗?选项1)不起作用的原因是因为我使用字典作为队列。我首先存储对象的副本,然后在需要时弹出输入。然后将该特定字典条目的副本返回给ask方法。问题是我无法创建使用NSManagedObject

    创建的[[...] insertIntoManagedObjectContext:nil];的副本

    任何解决方案?

1 个答案:

答案 0 :(得分: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];
    }
}

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

如果由于某种原因你确实需要这些属性的副本 - 但是,正如我所说,绝对没有理由这样做 - 你copy(如果你不使用autorelease那么ARC)将每个属性插入字典时。