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

时间:2011-10-06 19:32:34

标签: ios uiviewcontroller automatic-ref-counting uisearchdisplaycontroller

在关于UIViewController属性documentationsearchDisplayController 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是相关的。

2 个答案:

答案 0 :(得分:52)

我遇到了同样的事情。我以编程方式创建所有控制器/视图。一切都工作正常,直到我转换我的项目使用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
}

答案 1 :(得分:2)

上面的解决方案效果很好,但我也发现你可以使用

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

UIViewController子类的上下文中。