Утечки памяти UISearchDisplayController складываются при наборе текста - PullRequest
0 голосов
/ 22 августа 2011

Я недавно начал изучать цель-C и какао. Я медленно начинаю узнавать об управлении памятью. Обычно я немного понимаю логику этого. Но сейчас я немного растерялся. Вот моя проблема:

Я пытаюсь создать простое приложение для ios с функцией поиска. У меня есть UISearchDisplayController с UISearchbar внутри UITableViewController, который протекает (инструменты ...), как ад, когда я что-то набираю в нем. Компилятор и Анализатор не показывают никаких предупреждений или ошибок. Просто инструменты.

Я получаю ошибку из этой строки внутри метода handleSearchTerm:

self.searchResults = [[datenSort filteredArrayUsingPredicate:predicate] mutableCopy];

Вот мой метод handleSearchTerm:

- (void)handleSearchForTerm:(NSString *)searchTerm
{   
    self.savedSearchTerm = searchTerm;
    if ([self searchResults] == nil)
    {    

       NSMutableArray *array = [[NSMutableArray alloc] init];       
       self.searchResults = array;
       [array release], array = nil;
    }

    [[self searchResults] removeAllObjects];
    if ([[self savedSearchTerm] length] != 0)
    {

       NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(Name contains[cd] %@)", searchTerm];
       self.searchResults = [[datenSort filteredArrayUsingPredicate:predicate] mutableCopy];

      }


}

все свойства высвобождаются в методе dealloc. и они:

@property (nonatomic, copy) NSString *savedSearchTerm;
@property (nonatomic, retain) NSMutableArray *datenSort;
@property (nonatomic, retain) NSMutableArray *searchResults;

и вот как я помещаю их в табличное представление: cellForRowAtIndexPath:

    if(tableView == self.searchDisplayController.searchResultsTableView){

        dataItem = [searchResults objectAtIndex:indexPath.row];

    }else {

        dataItem = [datenSort objectAtIndex:indexPath.row];

    }

Ваши ответы ОЧЕНЬ высоко ценятся!

1 Ответ

1 голос
/ 22 августа 2011

Эта строка пропускает:

self.searchResults = [[datenSort filteredArrayUsingPredicate:predicate] mutableCopy];

Согласно правилам управления памятью, вы владеете любым создаваемым вами объектом и создаете объект, используя метод, имя которого начинается с "alloc", "new", "copy ", или" mutableCopy ".

Следовательно, mutableCopy возвращает сохраненный объект, а установщик свойства searchResults также сохраняет объект, в результате чего объект перезаписывается .Решение состоит в том, чтобы отказаться от владения объектом, отправив ему сообщение release ...

NSArray *temp = [[datenSort filteredArrayUsingPredicate:predicate] mutableCopy];
self.searchResults = temp;
[temp release];

... или autorelease.

self.searchResults = [[[datenSort filteredArrayUsingPredicate:predicate] mutableCopy] autorelease];
...