1

我正在用这个做 NSMutableDictionary 的深拷贝:https ://stackoverflow.com/a/5453600/555690

像这样:

NSMutableDictionary *myCopy = [originalMutableDictionary mutableDeepCopy];

我必须释放myCopy吗?

4

2 回答 2

4

我假设您没有使用ARC。答案应该是“是”,因为它是用副本创建的。在此处查看 NARC 规则:

在 Objective-C 中是否需要在方法的末尾释放参数?

在那个特定的代码中,它ret是使用创建的,dictionaryWithObjects所以它已经被自动释放了,但是还有一个额外retain的被显式调用。所以答案是……仍然是“是”,这遵循所有权政策

于 2012-08-18T16:15:06.770 回答
2

代码retain在创建时将 a 添加到返回值,并且在返回之前不平衡它:

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命名约定和内存管理规则,即mutableCopy名称中包含的方法返回一个拥有的值。

你通过这种方法得到的字典确实是你所有的,必须由你释放。

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

于 2012-08-18T17:44:44.177 回答