我需要暂时将NSManagedObject
的内容存储到字典中。因为核心数据有自己的内存管理程序,所以我不想保留任何指向NSManagedObject
字段的强指针,此时只有值感兴趣(值在视图控制器之间传递,MOCs是不同的)。我无法创建弱指针,因为我想控制内存回收何时完成。
我尝试了一些事情,都失败了或者不符合目的。
重复[[myNSMO alloc] initWithEntity:[NSEntityDescription entityForName:entity inManagedObjectContext:myNSMO.managedObjectContext] insertIntoManagedObjectContext:nil];
它有效,但不适合我的应用程序设计(没有详细说明)
使用NSDictionary
从NSManagedObject
生成[myNSMO dictionaryWithValuesForKeys:<#(NSArray *)#>]
。这不好,因为它返回一个包含NSManagedObject字段地址的字典。
使用copyWithZone创建一个NSDictionary
填充每个键值,就像这样
[myDictionary setObject:[myNSMO.field copyWithZone:nil] forKey:@"Key"];
也不起作用,我仍然得到字段地址......
手动输入每个字段
[myDictionary setObject:[NSString stringWithFormat:@"%@",myNSMO.field ] forKey:@"Key"];
这次很好,我确实得到了新的内存分配。但是手动编码很费时间......
有人找到聪明的方法吗?选项1)不起作用的原因是因为我使用字典作为队列。我首先存储对象的副本,然后在需要时弹出输入。然后将该特定字典条目的副本返回给ask方法。问题是我无法创建使用NSManagedObject
[[...] insertIntoManagedObjectContext:nil];
的副本
任何解决方案?
答案 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)将每个属性插入字典时。