Ios UISearchDisplayController在键入时内存泄漏会堆积起来
我最近开始学习objective-C和cocoa。我慢慢地开始学习内存管理。通常我能理解其中的逻辑。但现在我有点困惑。我的问题是: 我正在尝试制作一个带有搜索功能的简单ios应用程序。我有一个UISearchDisplayController,在UITableViewController中有一个UISearchbar,当我在其中键入内容时,它会像地狱一样泄漏(仪器…)。编译器和分析器都不显示警告或错误。只是仪器 我从handleSearchTerm方法中的这一行获得错误:Ios UISearchDisplayController在键入时内存泄漏会堆积起来,ios,xcode,memory-leaks,uisearchdisplaycontroller,Ios,Xcode,Memory Leaks,Uisearchdisplaycontroller,我最近开始学习objective-C和cocoa。我慢慢地开始学习内存管理。通常我能理解其中的逻辑。但现在我有点困惑。我的问题是: 我正在尝试制作一个带有搜索功能的简单ios应用程序。我有一个UISearchDisplayController,在UITableViewController中有一个UISearchbar,当我在其中键入内容时,它会像地狱一样泄漏(仪器…)。编译器和分析器都不显示警告或错误。只是仪器 我从handleSearchTerm方法中的这一行获得错误: self.search
self.searchResults = [[datenSort filteredArrayUsingPredicate:predicate] mutableCopy];
- (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];
}
}
以下是我的handleSearchTerm方法:
self.searchResults = [[datenSort filteredArrayUsingPredicate:predicate] mutableCopy];
- (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];
根据内存管理规则,您拥有您创建的任何对象,并使用名称以“alloc”、“new”、“copy”或“mutableCopy”开头的方法创建对象
因此,mutableCopy
返回一个保留的对象,而searchResults
属性设置器也保留该对象,导致该对象被过度保留。解决方案是通过向对象发送版本
…,放弃对象的所有权
NSArray *temp = [[datenSort filteredArrayUsingPredicate:predicate] mutableCopy];
self.searchResults = temp;
[temp release];
…或autorelease
消息
self.searchResults = [[[datenSort filteredArrayUsingPredicate:predicate] mutableCopy] autorelease];