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];