首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UISearchDisplayController保留周期

UISearchDisplayController保留周期
EN

Stack Overflow用户
提问于 2015-06-25 01:07:16
回答 2查看 290关注 0票数 0

我有一个很奇怪的问题,我找不到解决办法。在我的一个应用程序中,我需要通过编程创建一个UISearchDisplayController。我正在UITableViewController的子类中创建它。我遇到了一个非常简单的问题-我的搜索显示控制器要么立即释放,要么导致保留周期,并阻止它的内容控制器被释放。

在我的viewDidLoad方法中,我用以下代码实例化了我的UISearchDisplayController

代码语言:javascript
复制
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子类添加了一个属性

代码语言:javascript
复制
@property (nonatomic,strong) UISearchDisplayController *searchDisplayController;

在我的viewDidLoad中,我初始化了搜索控制器:

代码语言:javascript
复制
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方法中,我有:

代码语言:javascript
复制
- (void)dealloc
{
    NSLog(@"dealloc");
    self.searchDisplayController = nil;
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

行"dealloc“不会被打印,如果我用仪器分析我的视图控制器不会被释放。

我还尝试过添加其他名称不同的属性--它仍然没有被释放。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-25 16:13:28

好吧,我已经搞清楚了。为了在初始化UISearchDisplayController的视图控制器上调用dealloc,我必须这样做:

在.m文件的顶部添加以下内容:

代码语言:javascript
复制
static UISearchDisplayController *sC;

然后在viewDidLoad中初始化搜索控制器如下:

代码语言:javascript
复制
    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方法中执行以下操作:

代码语言:javascript
复制
- (void)dealloc
{
    sC = nil;
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

现在一切都很好。搜索控制器工作正常,所有内容都按其应有的方式被解除分配:)

票数 0
EN

Stack Overflow用户

发布于 2015-06-25 01:46:30

哈哈,你有没有问过我提供的那个问题。所以这个问题的摘要答案是:

  1. 使用属性保存UISearchDisplayController
  2. 当持卡人viewController被取消分配时,则为零。
  • ( self.searchDisplayController =0;}
  1. 不要使用UIViewController的默认属性searchDisplayController,它坏了
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31039588

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档