Hea*_*ers 30 uiviewcontroller uisearchdisplaycontroller ios automatic-ref-counting
在有关属性1的UIViewController 文档中,它说:searchDisplayController
如果以编程方式创建搜索显示控制器,则在初始化时,搜索显示控制器会自动设置此属性.
当我这样创建我的UISearchDisplayController时:
[[[UISearchDisplayController alloc] initWithSearchBar:searchBar contentsController:self] autorelease];
Run Code Online (Sandbox Code Playgroud)
-[UIViewController searchDisplayController]不是nil.但是,它在事件循环结束后被填写,这会导致搜索显示控制器在我触摸搜索栏时不显示.什么都没有崩溃.这很奇怪.如果我省略了呼叫autorelease,一切正常:
[[UISearchDisplayController alloc] initWithSearchBar:searchBar contentsController:self];
Run Code Online (Sandbox Code Playgroud)
然而,泄漏UISearchDisplayController(我用仪器验证了这一点).由于该searchDisplayController 属性被标记为(nonatomic, retain, readonly)我希望UISearchDisplayController它在设置后保留它.
此stackoverflow文章是相关的.
XJo*_*nes 53
我遇到了同样的事情.我以编程方式创建所有控制器/视图.一切都工作正常,直到我转换我的项目使用ARC.一旦我做了UISearchDisplayControllers,不再保留,并且在运行循环结束后searchDisplayController每个UIViewController中的属性为零.
我没有回答为什么会这样.Apple文档建议SDC应该由视图控制器保留,但这显然不会发生.
我的解决方案是创建第二个属性来保留SDC,当我卸载视图时我就把它取消.如果您不使用ARC,则需要mySearchDisplayController在viewDidUnload和中发布dealloc.否则这很好.
在MyViewController.h中:
@property (nonatomic, strong) UISearchDisplayController * mySearchDisplayController;
Run Code Online (Sandbox Code Playgroud)
在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
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6303 次 |
| 最近记录: |