初始化NSMutableDictionary时的iPhone内存泄漏

时间:2011-04-20 23:38:09

标签: iphone memory-leaks nsmutablearray nsmutabledictionary analyzer

我为添加到glossTerms的每个对象(除第一个对象外)收到内存泄漏。泄漏被描述为具有“A +1保留计数(拥有参考)” - 我已经在互联网上搜索并发现了几个在对象分配中使用“复制”的线程。我试过这个,但我一定没有正确实现它,因为我还有内存泄漏。

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

如果你们中的任何人能够对此有所了解,我将非常感激。

谢谢

1 个答案:

答案 0 :(得分:2)

NSArray将保留您添加到其中的任何对象并自动释放它,无论是在其生命周期结束时还是从阵列中删除它(如果它是可变的)。

分配对象时,保留计数为+1。

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

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 ...]自动返回一个自动释放的对象。