утечка памяти при добавлении объектов в nsarray - PullRequest
1 голос
/ 22 ноября 2010

В приведенном ниже коде 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 ]

3 голосов
/ 22 ноября 2010

Код, который вы нам показываете, верный и не содержит утечек.Последний раздел, тем не менее, неверен и может привести к сбою вашей программы, потому что вы выпускаете Person объектов, которые вам больше не принадлежат.

0 голосов
/ 24 ноября 2010

Где-то еще в вашем приложении вы, вероятно, вызываете [PersonListArray objectAtIndex:n] и передаете его другим частям вашего приложения. Одна из других частей вашего приложения, вероятно, утечка.

Если вы используете утечки, нажмите на конкретный «тип утечки», затем нажмите на адрес памяти, и он покажет вам историю alloc / free / retain / release / autorelease этого адреса памяти. Если вы включите детальное представление (я думаю, что Cmd-E), вы также увидите трассировки стека для всех них. Ищите что-то, что делает retain, но не соответствующий релиз. (Немного сложно, когда вещи сохраняются несколькими автоматически выпущенными массивами ...)

0 голосов
/ 22 ноября 2010

Ваш код, как изначально реализовано, является правильным.Массив сохраняет добавленные к нему объекты и освобождает их, когда они удаляются из массива или когда массив освобождается.Нет необходимости самостоятельно проходить через массив.

Какие средства вы используете для обнаружения утечки?Если это Инструменты, то вы, возможно, неправильно понимаете, что это говорит вам.Когда он обнаруживает утечку, он может показать вам, где память была впервые выделена.Он не может показать вам, какой объект ответственен за утечку.Поэтому я бы предположил, что данный метод dealloc никогда не вызывается (потому что этот объект просочился) или что кто-то еще сохраняет массив и не освобождает его.Попробуйте поместить NSLog в dealloc, чтобы убедиться, что это происходит;в качестве тестового прогона вы можете попробовать зарегистрировать PersonListArray после его освобождения - если это не вызывает исключения из памяти, то почти наверняка кто-то еще сохранил его.[PersonListArray retainCount] для вашей сделки, чтобы выяснить, в чем дело. ";см. комментарий к bbum ниже]

Самая распространенная причина случайного дополнительного сохранения - это свойства @ property / @ sythesize, для которых установлено сохранение, но для которых соответствующий выпуск не добавлен в dealloc.

...