我正在使用以下代码对NSMutableDictionary进行深层复制:https://stackoverflow.com/a/5453600/555690
像这样:
NSMutableDictionary *myCopy = [originalMutableDictionary mutableDeepCopy];
我是否必须发布myCopy
?
答案 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
的方法会返回一个拥有的值。
您从此方法获得的词典确实归您所有,必须由您发布。
请注意,上面代码段中的中间行确保字典中包含的对象仅由字典本身拥有;你不直接对此负责。当字典被销毁时,它们将被释放。