2010-03-12 78 views
14

我想知道是否需要释放复制的NSObject?例如,我只创建一个,我复制到一个数组词典:我需要释放复制的NSObject吗?Objective-c

代码:

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

我必须释放字典?如果是,何时?

谢谢

+0

+1好问题 – andy

+3

就像经验法则,在可可你必须发布你拥有的任何东西。如果您使用新的,复制,分配或保留的方式发送消息,则您拥有一些东西。如果你没有调用这些方法中的一种,那么你不拥有它,你不应该释放它。 –

回答

24

是的,你这样做。在这种情况下,你应该放开副本将它添加到阵列后,因为数组保留任何东西添加进去:

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

感谢您的信息! – ncohen

4

从文档此片段:

- (ID)复制

返回值 由NSCopying协议方法copyWithZone:返回的对象,其中区域为零。

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

NSObject本身不支持NSCopying协议。子类必须支持该协议并实现copyWithZone:方法。 copyWithZone:方法的子类版本应首先将消息发送到超级,以合并其实现,除非子类直接从NSObject下降。

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

0

很难说,没有看到你在哪里创建字典,无论这是否明智。如果在字典中没有其他的成员,它会更简单(虽然可以说是难以阅读:)做类似

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

那将会给您的数组中真正的NSDictionary对象,而不是的NSMutableDictionary您正在创建的副本。

+0

你是以什么理由声称NSMutableDictionary的副本不会是“* real * NSDictionary”? –

+0

理由是,如果您尝试向其中插入对象,* real * NSDictionary将抛出错误。 – Jeff