Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios UISearchDisplayController在键入时内存泄漏会堆积起来_Ios_Xcode_Memory Leaks_Uisearchdisplaycontroller - Fatal编程技术网

Ios UISearchDisplayController在键入时内存泄漏会堆积起来

Ios UISearchDisplayController在键入时内存泄漏会堆积起来,ios,xcode,memory-leaks,uisearchdisplaycontroller,Ios,Xcode,Memory Leaks,Uisearchdisplaycontroller,我最近开始学习objective-C和cocoa。我慢慢地开始学习内存管理。通常我能理解其中的逻辑。但现在我有点困惑。我的问题是: 我正在尝试制作一个带有搜索功能的简单ios应用程序。我有一个UISearchDisplayController,在UITableViewController中有一个UISearchbar,当我在其中键入内容时,它会像地狱一样泄漏(仪器…)。编译器和分析器都不显示警告或错误。只是仪器 我从handleSearchTerm方法中的这一行获得错误: self.search

我最近开始学习objective-C和cocoa。我慢慢地开始学习内存管理。通常我能理解其中的逻辑。但现在我有点困惑。我的问题是:

我正在尝试制作一个带有搜索功能的简单ios应用程序。我有一个UISearchDisplayController,在UITableViewController中有一个UISearchbar,当我在其中键入内容时,它会像地狱一样泄漏(仪器…)。编译器和分析器都不显示警告或错误。只是仪器

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

      }


}
以下是我的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];