我有一个很奇怪的问题,我找不到解决办法。在我的一个应用程序中,我需要通过编程创建一个UISearchDisplayController。我正在UITableViewController的子类中创建它。我遇到了一个非常简单的问题-我的搜索显示控制器要么立即释放,要么导致保留周期,并阻止它的内容控制器被释放。
在我的viewDidLoad方法中,我用以下代码实例化了我的UISearchDisplayController:
UISearchBar *searchBar = [[UISearchBar alloc] initWithFrame:CGRectZero];
sC = [[UISearchDisplayController alloc] initWithSearchBar:searchBar contentsController:self];
self.searchDisplayController.searchResultsDelegate = self;
self.searchDisplayController.searchResultsDataSource = self;
self.searchDisplayController.delegate = self;如果sC被定义为视图控制器中的属性或实例变量,则搜索控制器可以工作,但它阻止调用视图控制器的dealloc方法。但是,如果只将sC定义为viewDidLoad方法中的变量,那么我的视图控制器就会很好地被释放,但是self.searchDisplayController几乎立即变成nil,并且搜索无法工作。
有人知道怎么解决这个问题吗?我已经尝试过重写searchDisplayController属性了--没有用。
我应该提一下,我正在使用ARC。而且,当我说"dealloc不被调用“时,我的意思是我有一个没有打印的NSLog语句。
更新
正如一些用户建议的那样,已经有了答案,简单地覆盖searchDisplayController属性就可以了,我在下面发布了我所做的事情(这没有起作用)。
我向我的UITableViewController子类添加了一个属性
@property (nonatomic,strong) UISearchDisplayController *searchDisplayController;在我的viewDidLoad中,我初始化了搜索控制器:
UISearchBar *searchBar = [[UISearchBar alloc] initWithFrame:CGRectZero];
self.searchDisplayController = [[UISearchDisplayController alloc] initWithSearchBar:searchBar contentsController:self];
self.searchDisplayController.searchResultsDelegate = self;
self.searchDisplayController.searchResultsDataSource = self;
self.searchDisplayController.delegate = self;在视图控制器的dealloc方法中,我有:
- (void)dealloc
{
NSLog(@"dealloc");
self.searchDisplayController = nil;
[[NSNotificationCenter defaultCenter] removeObserver:self];
}行"dealloc“不会被打印,如果我用仪器分析我的视图控制器不会被释放。
我还尝试过添加其他名称不同的属性--它仍然没有被释放。
发布于 2015-06-25 16:13:28
好吧,我已经搞清楚了。为了在初始化UISearchDisplayController的视图控制器上调用dealloc,我必须这样做:
在.m文件的顶部添加以下内容:
static UISearchDisplayController *sC;然后在viewDidLoad中初始化搜索控制器如下:
if (sC==nil) {
UISearchBar *searchBar = [[UISearchBar alloc] initWithFrame:CGRectZero];
sC = [[UISearchDisplayController alloc] initWithSearchBar:searchBar contentsController:self];
}
self.searchDisplayController.searchResultsDelegate = self;
self.searchDisplayController.searchResultsDataSource = self;
self.searchDisplayController.delegate = self;然后在dealloc方法中执行以下操作:
- (void)dealloc
{
sC = nil;
[[NSNotificationCenter defaultCenter] removeObserver:self];
}现在一切都很好。搜索控制器工作正常,所有内容都按其应有的方式被解除分配:)
发布于 2015-06-25 01:46:30
哈哈,你有没有问过我提供的那个问题。所以这个问题的摘要答案是:
UISearchDisplayControllerUIViewController的默认属性searchDisplayController,它坏了https://stackoverflow.com/questions/31039588
复制相似问题