我是不是需要发布复制的 NSObjects - Objective-c

Posted

技术标签:

【中文标题】我是不是需要发布复制的 NSObjects - Objective-c【英文标题】:Do I need to release a copied NSObjects - Objective-c我是否需要发布复制的 NSObjects - Objective-c 【发布时间】:2011-01-26 15:47:37 【问题描述】:

我想知道我是否需要释放一个复制的 NSObject?例如,我只创建一个字典并将其复制到一个数组中:

代码:

for (int num = 0; num < [object count]; num++) 
    [dictionary setObject:[object objectAtIndex:num] forKey:@"x"];
    [array addObject:[dictionary copy]];

我必须释放字典吗?如果有,什么时候?

谢谢

【问题讨论】:

根据经验,在 Cocoa 中你必须释放你拥有的任何东西。如果您使用 new、copy、alloc 或 retain 向它发送消息,您就拥有了它。如果您没有调用这些方法之一,则您不拥有它,也不应该释放它。 【参考方案1】:

如果不查看您在哪里创建字典,就很难判断这是否明智。如果字典中没有其他成员,那么做类似的事情会更简单(虽然可以说更难阅读:)

for (int num = 0; num < [object count]; num++) 
    [array addObject:[NSDictionary
                           dictionaryWithObject:[object objectAtIndex:num]
                                        forKey:@"x"
                     ]
    ]

这将在您的数组中为您提供真正的 NSDictionary 对象,而不是您正在创建的 NSMutableDictionary 副本。

【讨论】:

您基于什么理由声称 NSMutableDictionary 的副本不会是“真正的 NSDictionary”? 基于一个真正的 NSDictionary 如果你尝试插入对象会抛出错误。【参考方案2】:

使用copy,您获得了返回对象的所有权。容器还拥有添加到它们的对象的所有权。 结果,正如诺亚指出的那样,您必须放弃副本的所有权。 Cocoa memory management guidelines 包含一个注释 how to work with containers 的部分。

【讨论】:

【参考方案3】:

文档中的这个片段:

- (id)copy

返回值 NSCopying 协议方法 copyWithZone: 返回的对象,其中 zone 为 nil。

讨论 对于采用 NSCopying 协议的类来说,这是一种方便的方法。如果没有 copyWithZone: 的实现,则会引发异常。

NSObject 本身不支持 NSCopying 协议。子类必须支持该协议并实现 copyWithZone: 方法。 copyWithZone: 方法的子类版本应该首先向 super 发送消息,以合并其实现,除非子类直接来自 NSObject。

特殊注意事项 如果您使用托管内存(不是垃圾回收),此方法会在返回新对象之前保留它。 然而,方法的调用者负责释放返回的对象。

【讨论】:

【参考方案4】:

是的,你知道。在这种情况下,您应该在将副本添加到数组后立即释放副本,因为数组会保留添加到其中的任何内容:

 NSDictionary *copied = [dictionary copy];
 [array addObject:copied];
 [copied release];

【讨论】:

以上是关于我是不是需要发布复制的 NSObjects - Objective-c的主要内容,如果未能解决你的问题,请参考以下文章

从 JSON 到 NSObjects 的对象映射库

使用 NSObjects 将文件保存到文档 NSMutableArray 的问题

swift 在swift中试验nsobjects

混合单个实例,而不是类

python中是不是有将单词拆分为列表的功能? [复制]

mysql的主从复制