繁体   English   中英

UISearchDisplayController保留周期

[英]UISearchDisplayController retain cycle

我有一个非常奇怪的问题,找不到解决方案。 在我的一个应用程序中,我需要以编程方式创建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”不会打印,并且如果我使用仪器进行配置文件,则不会释放视图控制器。

我还尝试添加其他名称不同的属性-仍然不会取消分配。

哈哈,你有没有想过我提供的那个问题。 因此,该问题的答案汇总:

  1. 使用属性保存您的UISearchDisplayController
  2. 当持有者viewController取消分配时,将其淘汰

     - (void)dealloc { self.searchDisplayController = nil; } 
  3. 不要使用UIViewController的默认属性searchDisplayController它已损坏

好的,我知道了。 为了在初始化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];
}

现在一切正常。 搜索控制器工作正常,一切都按需释放:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM