Как устранить утечки при выделении NSMutableArray в Objective-C - PullRequest
0 голосов
/ 24 мая 2010

Я получаю утечки в главном контроллере iPhone.

Когда я вызываю этот метод, я вставляю их в массив filteredListCount, потому что при поиске мне нужно показать список из filteredListCountиначе массив customerArray.

Эта функция работает нормально, но я получаю утечки в методе ниже при распределении: filteredListCount = [[NSMutableArray alloc] initWithCapacity: [customerArray count]];

Это первый контроллер представления моего приложения, япоказ списка, и я также разрешаю поиск из списка.

- (void)parser:(CustomerListLibXmlParser *)parser addCustomerObject:(Customer *)customerObj1
{

 [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
 [customerArray addObject:customerObj1];
 filteredListCount = [[NSMutableArray alloc] initWithCapacity: [customerArray count]];
 [filteredListCount addObjectsFromArray: customerArray];
 [theTableView reloadData];
}

- (void)parser:(CustomerListLibXmlParser *)parser encounteredError:(NSError *)error
{

}
- (void)parserFinished:(CustomerListLibXmlParser *)parser
{
 [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
 self.title=@"Customers";
}

Ответы [ 3 ]

1 голос
/ 26 сентября 2012

Чтобы предотвратить утечку памяти при выделении массива, вы можете проверить, существует ли он уже. Кроме того, это авто-релиз. То же самое для размещения шаблона TableViewCell:

if(filteredListCount == nil){
    filteredListCount = [[[NSMutableArray alloc] initWithCapacity:[customerArray count]] autorelease];
}
0 голосов
/ 24 мая 2010

Эта функция работает нормально, но Я получаю утечки в методе ниже при выделении: FilterListCount = [[NSMutableArray alloc] initWithCapacity: [customerArray число]];

На iphone нет сборки мусора. Если FilterListCount уже указывает на выделенный блок памяти, и вы назначаете ему что-то еще, этот блок будет продолжать существовать.

Сначала очистить отфильтрованный список.

if(filteredListCount){
  [filteredListCount release];
  filteredListCount = nil;
}
// now you're sure filteredListCount is empty
filteredListCount = [[NSMutableArray alloc] initWithCapacity: [customerArray count]];

Или просто используйте свойство retain.

0 голосов
/ 24 мая 2010

когда, где и как объявляются customerArray и FilterListCount?

ЕСЛИ FilterListCount является свойством, используйте self.filteredListCount = .... для правильного освобождения любой предыдущей памяти. Вы также можете сделать [FilterListCount removeAllObjects]

Также не ясно, что в вашем коде есть какие-то деаллоки (что, очевидно, является утечкой).

...