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

Hea*_*ers 30 uiviewcontroller uisearchdisplaycontroller ios automatic-ref-counting

在有关属性1UIViewController 文档中,它说: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,则需要mySearchDisplayControllerviewDidUnload和中发布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)

  • 只是想帮忙.我没有看到关于此的官方消息.很明显,正如我们所发现的那样,这些都是破碎或错误记录的. (4认同)
  • 仍在iOS 7. Duped. (4认同)
  • 两年后,你仍然在帮助人们解决这个问题!非常感谢.我不知道为什么我的不工作. (3认同)