0

我收到了添加到glossTerms(除了第一个对象)的每个对象的内存泄漏。泄漏被描述为具有“A + 1保留计数(拥有引用)” - 我已经搜索了互联网,并发现了一些提到在对象分配中使用“复制”的线程。我试过这个,但是我不能正确实现它,因为我仍然有内存泄漏。初始化NSMutableDictionary时iPhone内存泄漏

- (void)createTermData { 

NSMutableArray *glossTerms=[[NSMutableArray alloc] init]; 

[glossTerms addObject:[[NSMutableDictionary alloc] 
         initWithObjectsAndKeys:@"Approximate",@"term", 
         @"Test",@"definition",@"Test2",@"example",nil]]; 

[glossTerms addObject:[[NSMutableDictionary alloc] 
         initWithObjectsAndKeys:@"Arithmetic Mean",@"term", 
         @"Test",@"definition",@"Test2",@"example",nil]]; 

termData=[[NSMutableArray alloc] initWithObjects: 
      glossTerms,nil]; 

[glossTerms release]; 

如果你们中的任何一个人都能够解释这一点,我会非常感激。

谢谢

回答

2

一个NSArray将保留您添加到它,并自动释放它的任何对象,无论是在结束它的生命周期或者一旦你从数组中删除它(如果它是可变的)。

当你分配一个对象时,它的保留计数是+1。

因此,当您分配一个对象并将其添加到数组时,它的保留计数为+2。这意味着你必须自动释放对象(这是我为你的情况做的,因为你正在分配你添加的同一行),或者如果你有一个指针的引用,在添加它之后释放它。在你的情况下,你没有参考,所以autoreleasing它是你最好的选择。

NSMutableArray *glossTerms=[[NSMutableArray alloc] init]; 

[glossTerms addObject:[[[NSMutableDictionary alloc] 
         initWithObjectsAndKeys:@"Approximate",@"term", 
         @"Test",@"definition",@"Test2",@"example",nil] autorelease]]; 

[glossTerms addObject:[[[NSMutableDictionary alloc] 
         initWithObjectsAndKeys:@"Arithmetic Mean",@"term", 
         @"Test",@"definition",@"Test2",@"example",nil] autorelease]]; 

termData=[[NSMutableArray alloc] initWithObjects: 
      glossTerms,nil]; 

[glossTerms release]; 

FWIW,静态方法[NSMutableDictionary dictionaryWith ...]自动返回一个自动释放对象。

+0

我真的很感谢回复,谢谢! – Lee 2011-04-20 23:58:30

+0

迈克这是一个很好的回应,非常感谢你的回答。完美解决了我的问题! – ninu 2011-07-13 18:25:54