ios – 创建NSManagedObject的副本

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

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

>重复[[myNSMO alloc] initWithEntity:[NSEntityDescription entityForName:entity inManagedObjectContext:myNSMO.managedObjectContext] insertIntoManagedObjectContext:nil];
它工作正常,但不适合我的应用程序设计(没有深入细节)
>使用[myNSMO dictionaryWithValuesForKeys:<#(NSArray *)#>]从NSManagedObject生成NSDictionary.这不好,因为它返回一个包含NSManagedObject字段地址的字典.
>创建一个NSDictionary,使用copyWithZone填充每个键值,就像这样
[myDictionary setObject:[myNSMO.field copyWithZone:nil] forKey:@“Key”];
也不起作用,我仍然得到现场地址……
>手动输入每个字段
[myDictionary setObject:[NSString stringWithFormat:@“%@”,myNSMO.field] forKey:@“Key”];
这次很好,我确实得到了新的内存分配.但手动编码很费时间……

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

有解决方案吗

最佳答案
在大多数意义上保持对托管对象字段的强指针是安全的 – 关系是特殊的,但日期,字符串和数字的实际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];
    }
}

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

如果由于某种原因你确实需要这些属性的副本 – 但是,正如我所说,绝对没有理由这样做 – 当你将它们插入字典时,你会复制(并且如果你没有使用ARC则自动释放)每个属性.

转载注明原文:ios – 创建NSManagedObject的副本 - 代码日志