将对象添加到nsarray时发生内存泄漏

时间:2010-11-22 00:27:59

标签: iphone memory-leaks

在下面的代码中,PersonListArray是一个NSMutableArray,我从sqlite数据库中获取人员列表并将其添加到我的数组中。

Person* tmpPerson = [[Person alloc] init];
tmpPerson.personName = @"Mike";
tmpPerson.personEmail = @"mike@mike.com"; 

[PersonListArray addObject:tmpPerson];
[tmpPerson release];

即使我在这里发布了Person对象,它给出了一个内存泄漏,我猜是因为数组保存了一个引用计数。我正在程序中的其他位置使用该数组,然后肯定会释放它。

为数组创建新对象的最佳做法是什么,而不是遇到此问题?

在dealloc方法中,我释放了数组

-(void) dealloc{
  [PersonListArray release]; // this contains the numerous Person objects
  [super dealloc];
}

我应该像这样手动释放它们吗?

-(void) dealloc{

   for (int i = 0; i<PersonListArray.count;i++)
   {
     Person * tmpPerson = [PersonListArray objectAtIndex:i];
     [tmpPerson release];
   }

  [PersonListArray release];
  [super dealloc];
}

3 个答案:

答案 0 :(得分:3)

您向我们展示的代码是正确的,不包含任何泄漏。但是,最后一部分是错误的,并且会导致程序崩溃,因为您正在发布不再拥有的Person个对象。

答案 1 :(得分:0)

您最初实施的代码是正确的。一个数组保留添加到它上面的onjects,并在它们从数组中删除或者释放数组时释放它们。无需自己完成阵列。

您使用什么方法来检测泄漏?如果它是乐器,那么你可能会误解它告诉你的是什么。当它检测到泄漏时,它可以显示内存首次分配的位置。它无法显示哪个对象导致泄漏。因此我猜测给定的dealloc方法永远不会被调用(因为该对象被泄露)或者其他人保留了数组并且没有释放它。尝试将NSLog放入dealloc以确保它正在发生;作为一次运行测试,您可以在释放后尝试记录PersonListArray - 如果这不会导致内存异常,那么几乎可以肯定其他人保留了它。

[REMOVED:我的原始文本“尝试将[PersonListArray retainCount]的NSLog添加到你的dealloc中以找出是哪种情况。”;见下面的bbum评论]

偶然附加保留的最常见原因是@ property / @ sythesize属性设置为保留但未将匹配的版本添加到dealloc。

答案 2 :(得分:0)

您应用中的其他位置,您可能会拨打[PersonListArray objectAtIndex:n]并将其传递给应用的其他各个部分。您的应用程序的其他部分之一可能是泄漏它。

如果您正在使用泄漏,请单击特定的“泄漏类型”,然后单击内存地址,它将显示该内存地址的alloc / free / retain / release / autorelease历史记录。如果启用详细视图(我认为是Cmd-E),您将看到所有这些的堆栈跟踪。寻找正在做保留而不是相应版本的东西。 (当多个自动释放的数组保留内容时,这有点困难......)