使用UISearchBar作为UITableView的标题视图不可避免地保留周期?

时间:2016-09-22 00:22:30

标签: ios objective-c uitableview automatic-ref-counting uisearchbar

我遇到了这个问题,因为我正在构建一个使用UISearchController及其UISearchBar成员的基本用户界面。我的tableView是一个弱IBOutlet,就像Apple Docs演示一样,我将tableHeaderView属性设置为搜索栏成员。

//Snippet from viewDidLoad
UISearchController* searchController = [self createSearchController];
UISearchBar* searchBar = searchController.searchBar;
searchBar.userInteractionEnabled = NO;

self.tableView.tableHeaderView = searchBar; //The assignment in question

[NetworkStuff makeCall:^(Response *response) {
    //handle success
    searchBar.userInteractionEnabled = YES; //local variables
    searchController.active = YES;
    ...
} failure:^(Response *response) {
    //handle failure
    ...
}];

当我从堆栈中弹出视图时,即使我在viewWillDisappear:中将tableHeaderView设置为nil,也不会调用其dealloc方法。我需要注释掉看dealloc的唯一一行就是初始赋值。

任何人都知道为什么会发生这种情况?

编辑:

发现了一些有趣的行为。另外,根据Apple文档,我将控制器的definesPresentationContext变量设置为YES。在将tableViewHeader赋值保留在固定保留周期的同时将其注释掉,即使我没有删除tableViewHeader。但是,在definesPresentationContext中设置viewDidLoad并在viewWillDisappear中清除它会重新引入保留周期。

1 个答案:

答案 0 :(得分:0)

偶然发现了这个答案: UISearchController retain issue

解决方案似乎是在viewDidDisappear:中明确地解除了UISearchController(注意,我无法在viewWillDisappear:中使用它)。由于该代码很快,我将在此处转录为Objective-C:

- (void)viewDidDisappear:(BOOL)animated {
    [super viewDidDisappear:animated];

    if (!self.presentingViewController) {
        [self.searchController dismissViewControllerAnimated:NO completion:nil];
    }
}

正如原始答案所指出的那样,检查self.presentingViewController不存在对于将另一个视图控制器推到视图顶部的情况很有帮助,因为我们将回到页面。很有可能,我们只想在弹出包含它的视图控制器时解除searchController。