2011-08-21 1 views
0

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

Я пытаюсь сделать простое приложение 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; 

и это, как я положил их в Tableview: cellForRowAtIndexPath:

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

     dataItem = [searchResults objectAtIndex:indexPath.row]; 

    }else { 

     dataItem = [datenSort objectAtIndex:indexPath.row]; 

    } 

ваши ответы очень высоко ценится!

ответ

1

Эта линия утечки:

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

В соответствии с правилами управления памятью, вы владеете какой-либо объект, вы создаете, и вы создаете объект, используя метод, имя которого начинается с «Alloc», «новый», «копия "или" mutableCopy ".

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

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

... или autorelease сообщений.

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