UIViewController不保留其以编程方式创建的UISearchDisplayController

问题描述 投票:29回答:2

UIViewController documentation关于searchDisplayController属性1它说:

如果以编程方式创建搜索显示控制器,则在初始化时,搜索显示控制器会自动设置此属性。

当我这样创建我的UISearchDisplayController时:

[[[UISearchDisplayController alloc] initWithSearchBar:searchBar contentsController:self] autorelease];

-[UIViewController searchDisplayController]不是nil。但是,它在事件循环结束后被填零,这会导致搜索显示控制器在我触摸搜索栏时不显示。什么都没有崩溃。这很奇怪。如果我省略对autorelease的调用,一切正常:

[[UISearchDisplayController alloc] initWithSearchBar:searchBar contentsController:self];

然而,泄漏了UISearchDisplayController(我用仪器验证了这一点)。由于searchDisplayController property被标记为(nonatomic, retain, readonly),我预计它会在设置后保留UISearchDisplayController

This stackoverflow article是相关的。

ios uiviewcontroller automatic-ref-counting uisearchdisplaycontroller
2个回答
53
投票

我遇到了同样的事情。我以编程方式创建所有控制器/视图。一切都工作正常,直到我转换我的项目使用ARC。一旦我做了UISearchDisplayControllers不再保留,并且在运行循环结束后每个searchDisplayController中的UIViewController属性为零。

我没有回答为什么会这样。 Apple文档建议SDC应该由视图控制器保留,但这显然不会发生。

我的解决方案是创建第二个属性来保留SDC,当我卸载视图时我就把它取消。如果您不使用ARC,则需要在mySearchDisplayControllerviewDidUnload中发布dealloc。否则这很好。

在MyViewController.h中:

@property (nonatomic, strong) UISearchDisplayController * mySearchDisplayController;

在MyViewController.m中:

@synthesize mySearchDisplayController = _mySearchDisplayController;

- (void)viewDidLoad
{
    [super viewDidLoad];
    // create searchBar
    _mySearchDisplayController = [[UISearchDisplayController alloc] initWithSearchBar:searchBar contentsController:self];
    _mySearchDisplayController.delegate = self;
    _mySearchDisplayController.searchResultsDataSource = self;
    _mySearchDisplayController.searchResultsDelegate = self;
    // other stuff
}

- (void)viewDidUnload
{
    [super viewDidUnload];
    _mySearchDisplayController = nil;
    // other stuff
}

3
投票

上面的解决方案工作正常,但我也发现你可以使用

[self setValue:mySearchDisplayController forKey:@"searchDisplayController"]

UIViewController子类的上下文中。

© www.soinside.com 2019 - 2024. All rights reserved.