在 UISearchDisplayController 上遇到僵尸问题
Posted
技术标签:
【中文标题】在 UISearchDisplayController 上遇到僵尸问题【英文标题】:Having a zombie issue on UISearchDisplayController 【发布时间】:2013-10-06 21:40:41 【问题描述】:在将 UISearchDisplayController 与 UITableView 一起使用时,我遇到了僵尸。
UISearchDisplayController(和视图的其余部分)是通过界面构建器设置的(xcode 5 上的故事板,仅使用 ARC 和 ios 7)。
searchDisplayController被这2个方法使用
-(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
[self filterContentForSearchText:searchString scope:
[[self.searchDisplayController.searchBar scopeButtonTitles] objectAtIndex:[self.searchDisplayController.searchBar selectedScopeButtonIndex]]];
return YES;
-(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchScope:(NSInteger)searchOption
[self filterContentForSearchText:self.searchDisplayController.searchBar.text scope:
[[self.searchDisplayController.searchBar scopeButtonTitles] objectAtIndex:searchOption]];
return YES;
仪器正在向我提供此信息
# Event Type ∆ RefCt RefCt Timestamp Responsible Library Responsible Caller
0 Malloc +1 1 00:10.739.188 UIKit -[UITableView setTableHeaderBackgroundColor:]
1 Retain +1 2 00:10.739.214 UIKit -[UIView(Internal) _addSubview:positioned:relativeTo:]
2 Retain +1 3 00:10.739.234 UIKit -[UISearchDisplayController _configureSearchBarForTableView]
3 Retain +1 4 00:10.739.291 UIKit -[UIView(Hierarchy) subviews]
4 Retain +1 5 00:10.771.238 UIKit -[UIView(Hierarchy) subviews]
5 Retain +1 6 00:10.782.890 QuartzCore -[CALayer layoutSublayers]
6 Release -1 5 00:10.782.891 QuartzCore -[CALayer layoutSublayers]
7 Release -1 4 00:10.792.538 QuartzCore CA::Transaction::observer_callback(__CFRunLoopObserver*, unsigned long, void*)
8 Release -1 3 00:15.446.447 UIKit -[UITableView dealloc]
9 Release -1 2 00:15.446.661 UIKit -[UIView(Internal) _invalidateSubviewCache]
10 Release -1 1 00:15.446.679 UIKit -[UIView(Hierarchy) removeFromSuperview]
11 Release -1 0 00:15.446.744 UIKit -[UITableView setTableHeaderBackgroundColor:]
12 Zombie -1 00:15.446.765 UIKit -[UISearchDisplayController _cleanUpSearchBar]
我尝试像这样在 dealloc 方法中清理 UISearchDisplayController
-(void)dealloc
self.searchDisplayController.searchResultsTableView.delegate = nil;
self.searchDisplayController.delegate = nil;
self.searchDisplayController.searchBar.delegate = nil;
self.searchDisplayController.searchResultsDelegate = nil;
self.searchDisplayController.searchResultsDataSource = nil;
但是没有用。
你知道我做错了什么吗?
感谢您的帮助。
【问题讨论】:
【参考方案1】:我想我已经能够解决这个问题。这是另一个关于解决方法的问题:
UISearchDisplayController causes crash after viewDidUnload
所以我补充说:
@property (nonatomic, weak) IBOutlet UISearchBar *searchBar;
@property (nonatomic) UISearchDisplayController *searchController;
然后在viewDidLoad中:
UISearchDisplayController *searchController = [[UISearchDisplayController alloc] initWithSearchBar:[self searchBar] contentsController:self];
[searchController setDelegate:self];
[searchController setSearchResultsDelegate:self];
[searchController setSearchResultsDataSource:self];
[self setSearchController:searchController];
并且在dealloc中:
[self setSearchController:nil];
这似乎解决了它。
【讨论】:
谢谢,它工作得很好,但我承认我不明白为什么。你能解释一下它是如何解决这个问题的吗?再次感谢:) 我知道你的意思。我真的不明白为什么它自己工作。像这样的 iOS 7 解决方法越来越多。 Same here... 解决方法有效,但我想了解此问题的原因。【参考方案2】:可能是与未保留 searchDisplayController 相关的已知问题。试试这个来增加保留计数:
在.h中:
@property (nonatomic, strong) UISearchDisplayController *searchController;
在 viewDidLoad 中:
self.searchController = (__bridge UISearchDisplayController *)(CFBridgingRetain(self.searchDisplayController));
在 dealloc 中(不确定是否需要):
self.searchController = CFBridgingRelease((__bridge void*)(self.searchController));
【讨论】:
当我进行临时发布但在调试模式下崩溃时它可以工作。关于如何解决这个问题的任何想法?【参考方案3】:- (void) viewDidDisappear:(BOOL)animated
[super viewDidDisappear:animated];
self.tableView = nil;
【讨论】:
以上是关于在 UISearchDisplayController 上遇到僵尸问题的主要内容,如果未能解决你的问题,请参考以下文章
NOIP 2015 & SDOI 2016 Round1 & CTSC 2016 & SDOI2016 Round2游记