UISearchDisplayController保留循环

时间:2015-06-25 01:07:16

标签: ios objective-c iphone cocoa-touch

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

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

2 个答案:

答案 0 :(得分:0)

哈哈,你有没有提到我提供的那个问题。因此,该问题的摘要已被接受:

  1. 使用属性来保存您的UISearchDisplayController
  2. 当持有者viewController dealloc为零时

    - (void)dealloc {
         self.searchDisplayController = nil;
    }
    
  3. 请勿使用UIViewController的默认属性searchDisplayController

答案 1 :(得分:0)

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

在.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];
}

现在一切都很好。搜索控制器工作正常,所有内容都应该取消分配:)