我是否必须以这种方式发布深度复制的NSMutableDictionary?

时间:2012-08-18 16:06:16

标签: objective-c ios

我正在使用以下代码对NSMutableDictionary进行深层复制:https://stackoverflow.com/a/5453600/555690

像这样:

NSMutableDictionary *myCopy = [originalMutableDictionary mutableDeepCopy];

我是否必须发布myCopy

2 个答案:

答案 0 :(得分:4)

我假设你没有使用ARC。答案“是”,因为它是使用副本创建的。请参阅此处的NARC规则:

Do you need to release parameters of methods at the end of them in Objective-C?

在该特定代码中,ret是使用dictionaryWithObjects创建的,因此它已经被自动释放,但是有一个额外的retain被明确调用。所以答案是......仍然是“是”,它跟在 ownership policy 之后。

答案 1 :(得分:2)

代码在创建后的右侧为返回值添加了retain,并且在返回之前没有平衡:

NSMutableArray *ret = [[NSMutableArray arrayWithObjects:cArray count:count] retain];

// The newly-created array retained these, so now we need to balance the above copies
for (unsigned int i = 0; i < count; ++i)
    [cArray[i] release];

return ret;

这符合Cocoa naming convention和内存管理规则,它们表示名称中带有mutableCopy的方法会返回一个拥有的值。

您从此方法获得的词典确实归您所有,必须由您发布。

请注意,上面代码段中的中间行确保字典中包含的对象仅由字典本身拥有;你不直接对此负责。当字典被销毁时,它们将被释放。