2011-08-21 27 views
0

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

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

号当release阵列,内部的每一项被自动所以就不需要将其删除,释放它们或调整它们的其它简单地释放使用-[NSArray release]

阵列发送release消息正确的代码是

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

如果OP仍然想使用该数组,那么'[myArray removeAllObjects]'是比[myArray release]更好的选择。数组中的对象从数组中移除时会发送'release'消息。 – glorifiedHacker

+0

是的,但是他/他没有说他/他想重复使用它,所以我认为这是愚蠢的。 – coneybeare

+1

您不拥有该阵列,因此您无法释放它。它会在autorelease池被耗尽时被释放。 – Chuck

-1

只使用“释放”。 如果您使用的是malloc而不是“free”。

+0

这不回答被问到的问题。 OP询问数组中的元素是否需要单独发布*另外*发送myArray removeAllObjects消息。答案是不。 – glorifiedHacker

0

好的,当你释放一个字典或者你从一个拥有它的对象中移除对象并且它的保留计数是0时,这意味着它被释放。如果字典仅由数组拥有(它的保留计数为1),并且您移除了该对象,则数组不会拥有该字典,因此它将释放它。这将随后释放字典内的对象。

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

0

你不需要做任何的电话来​​与代码是(对于memory management's sake,反正),因为无论是NSMutableArrayNSMutableDictionary被自动释放(因为你使用了类方法初始化)。

然而,对于not flooding the autorelease pool本地到该位的代码(这取决于有多少重复的循环,字典添加到阵列正在经历)的缘故,你可能会使用下面的代码中找到一些提高内存效率:

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]; 

如果你想重新使用数组没有在这一点上重新分配它,你也可以使用​​发布的所有内容,从而释放字典其中的内容,以及 - 只要因为在完成使用之后以及在您离开示波器之前,您仍然会发送一个release消息。

+0

我仍然想知道是否有必要发布myDic。 – user698200

+0

只有当您'alloc/init''d它(更多次你释放它)。 Cocoa中内存管理的关键是平衡你的'retain'(或'alloc/init','copy's或'new's)和'release''。 –