UISearchDisplayController在输入时出现内存泄漏堆积

问题描述:

我最近开始学习Objective-C和cocoa。我慢慢开始了解内存管理。通常我有点抓住它的逻辑。但现在我有点困惑。这是我的问题:UISearchDisplayController在输入时出现内存泄漏堆积

我想做一个简单的搜索功能的iOS应用程序。我有一个UISearchDisplayController在UITableViewController里面有一个UISearchbar,当我在里面输入东西的时候就像地狱一样泄漏(仪器..)。编译器和分析器都不显示警告或错误。只是乐器。

我来自该行的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]; 

    } 

你的答案是非常非常感谢!

这条线泄漏:

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

按照内存管理规则,你自己创建的任何对象,并创建使用名称以“黄金”的方法的对象,“新”,“复制“或”mutableCopy“。

因此,mutableCopy返回一个保持对象和searchResults属性setter还保留了对象,从而在对象被过度保留。解决的办法是通过发送一个release放弃对象的所有权......

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

...或autorelease消息。

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