我有一个非常奇怪的问题,我找不到解决方案。在我的某个应用中,我需要以编程方式创建UISearchDisplayController
。我在UITableViewController
的子类中创建它。我遇到一个非常简单的问题 - 我的搜索显示控制器要么立即释放,要么导致保留周期并阻止其内容控制器被释放。
在我的viewDidLoad
方法中,我使用以下代码实例化UISearchDisplayController
:
UISearchBar *searchBar = [[UISearchBar alloc] initWithFrame:CGRectZero];
sC = [[UISearchDisplayController alloc] initWithSearchBar:searchBar contentsController:self];
self.searchDisplayController.searchResultsDelegate = self;
self.searchDisplayController.searchResultsDataSource = self;
self.searchDisplayController.delegate = self;
如果在我的视图控制器中将sC
定义为属性或实例变量,则搜索控制器可以正常工作,但它会阻止调用视图控制器的dealloc
方法。但是,如果sC
仅在viewDidLoad
方法中定义为变量,则我的视图控制器会被解除分配,但self.searchDisplayController
几乎立即变为nil
,搜索不起作用
有谁知道如何解决这个问题?我已经尝试覆盖searchDisplayController
属性 - 它没有帮助。
我应该提一下,我正在使用ARC。另外,当我说“dealloc
未被调用”时,我的意思是我在那里有一个NSLog
语句,但没有打印出来。
正如一些用户建议已经有一个答案而且简单地覆盖searchDisplayController
属性应该可行,我会在我的下面发布(这不起作用)。
我在UITableViewController
的子类中添加了一个属性:
@property (nonatomic,strong) UISearchDisplayController *searchDisplayController;
在我的viewDidLoad
我初始化了我的搜索控制器:
UISearchBar *searchBar = [[UISearchBar alloc] initWithFrame:CGRectZero];
self.searchDisplayController = [[UISearchDisplayController alloc] initWithSearchBar:searchBar contentsController:self];
self.searchDisplayController.searchResultsDelegate = self;
self.searchDisplayController.searchResultsDataSource = self;
self.searchDisplayController.delegate = self;
在我的视图控制器的dealloc
方法中,我有:
- (void)dealloc
{
NSLog(@"dealloc");
self.searchDisplayController = nil;
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
线“dealloc”没有打印出来,如果我用仪器配置文件,我的视图控制器就不会被释放。
我还尝试添加其他名称不同的属性 - 它仍然没有被取消分配。
答案 0 :(得分:0)
UISearchDisplayController
当持有者viewController dealloc为零时
- (void)dealloc {
self.searchDisplayController = nil;
}
请勿使用UIViewController
的默认属性searchDisplayController
答案 1 :(得分:0)
好的,我已经弄清楚了。为了在视图控制器上调用dealloc,初始化UISearchDisplayController
我必须这样做:
在.m文件的顶部添加以下内容:
static UISearchDisplayController *sC;
然后在viewDidLoad中初始化搜索控制器,如下所示:
if (sC==nil) {
UISearchBar *searchBar = [[UISearchBar alloc] initWithFrame:CGRectZero];
sC = [[UISearchDisplayController alloc] initWithSearchBar:searchBar contentsController:self];
}
self.searchDisplayController.searchResultsDelegate = self;
self.searchDisplayController.searchResultsDataSource = self;
self.searchDisplayController.delegate = self;
然后在dealloc
方法中执行以下操作:
- (void)dealloc
{
sC = nil;
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
现在一切都很好。搜索控制器工作正常,所有内容都应该取消分配:)