我删除数组时是否必须删除字典中的每个元素?

时间:2011-08-21 20:16:09

标签: iphone objective-c

当我删除数组时,我是否也删除了字典的每个元素?

NSMutableArray *myArry = [NSMutableArray arrayWithCapacity:100];
NSMutableDictionary *myDic = [NSMutableDictionary dictionaryWithCapacity:10];
[myArray addObject:myDic]; // this is done in loop


[myDic removeAllObjects]; // Is this necessary?
[myArray removeAllObjects];

4 个答案:

答案 0 :(得分:4)

没有。当您release数组时,其中的每个项目都会自动发送release消息,因此您不需要删除它们,释放它们或调整它们,只需使用-[NSArray release] <释放数组/ p>

正确的代码是

NSMutableArray *myArry = [[NSMutableArray alloc] initWithCapacity:100];
NSMutableDictionary *myDic = [NSMutableDictionary dictionaryWithCapacity:10];
[myArray addObject:myDic]; // this is done in loop
…
[myArray release]; // To dispose of the array and it's contents. No need to remove objects

NSDictionary的行为方式相同,也就是说,您不需要删除它们,只释放它们。在移动示例中,您添加的词典是自动释放的,这意味着一旦myArray释放它们,它们就会被释放

答案 1 :(得分:0)

好的,当您释放字典或从拥有它的对象中删除对象并且其保留计数为0时,表示它已被释放。如果字典仅由数组拥有(它的保留计数为1)并且您删除了该对象,则该数组不拥有该字典,因此它将释放它。这将随后释放字典中的对象。

最好在编程之前阅读内存管理和对象所有权,因为你不想泄漏。 http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/MemoryMgmt.html

答案 2 :(得分:0)

您不需要使用您的代码对removeAllObjects进行任何一次调用(无论如何都是memory management's sake),因为NSMutableArray和{{1}都是如此是自动释放的(因为你使用了类方法初始值设定项)。

但是,为了这个代码的not flooding the autorelease pool本地代码(并且根据你向数组中添加字典的循环次数的迭代次数),你可能会发现使用以下内容提高了内存效率代码:

NSMutableDictionary

如果您想在不重新分配数组的情况下重新使用数组,您还可以使用NSMutableArray *myArry = [[NSMutableArray alloc] initWithCapacity:100]; NSMutableDictionary *myDic = [[NSMutableDictionary alloc] initWithCapacity:10]; [myArray addObject:myDic]; // this is done in loop [myDic release]; // ... other code... [myArray release]; 释放其所有内容,从而释放其中的词典内容 - 如只要您在使用完毕后仍然发送removeAllObjects消息,并在离开范围之前发送消息。

答案 3 :(得分:-1)

只需使用“发布”即可。 如果您使用的是malloc而不是“free”。