在关于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
。
答案 0 :(得分:52)
我遇到了同样的事情。我以编程方式创建所有控制器/视图。一切都工作正常,直到我转换我的项目使用ARC。完成后,UISearchDisplayControllers
不再保留,并且在运行循环结束后,每个searchDisplayController
中的UIViewController
属性为零。
我没有回答为什么会这样。 Apple文档建议SDC应该由视图控制器保留,但这显然不会发生。
我的解决方案是创建第二个属性以保留SDC,并在卸载视图时将其取消。如果您不使用ARC,则需要在mySearchDisplayController
和viewDidUnload
中发布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
子类的上下文中。