iOS 7中的新UISearchBar

3

我在iOS 7中遇到了新的UISearchBar问题。

我的应用程序中有一个带有搜索栏的表格视图。它是手工制作的(以编程方式添加)-在storyboard中的tableviewcontroller中,在viewDidLoad方法中,我使用从UISearchBar继承的自定义searchbar添加了searchDisplayController。

所有事情都在导航控制器中进行。

在我的应用程序逻辑中,在某个点上,我通过发送dismissViewController释放此nav控制器。

在iOS 6中,它完美运行。

但是在iOS 7中,当尝试释放导航控制器时,应用程序崩溃。

日志中出现了这些有趣的行:

在viewDidLoad的结尾,我添加了以下内容:

for (UIView *view in self.view.subviews) {
    NSLog(@"%@ %p", [view.class description], view);
}

在iOS 6中,我只有以下内容:
2013-09-19 12:40:40.553 myApp[4182:c07] KRSearchBar 0x988bdd0

在iOS 7中:
2013-09-19 13:08:47.808 myApp[4690:a0b] UIView 0xa265310
2013-09-19 13:08:47.809 myApp[4690:a0b] UITableViewWrapperView 0xa25b4d0
2013-09-19 13:08:47.810 myApp[4690:a0b] KRSearchBar 0xa2591b0

释放导航控制器后,我已经
2013-09-19 13:09:32.419 myApp[4690:a0b] *** -[UIView release]: message sent to     deallocated instance 0xa265310

什么是UIView?它来自哪里?如何处理它?
1个回答

17

iOS 7 改变了有关 tableview 及其代理的一些规则,但并没有在容易找到的地方进行说明。

基本上,在早期版本的 iOS 中,可以选择将 tableView 的 delegate 和 datasource 设置为 nil。不这样做也不会发送任何错误消息。

从 iOS 7 开始,必须在 dealloc 中将它们设置为 nil,否则可能导致应用崩溃。

- (void)dealloc
{
fetchedResultsController.delegate = nil;
self.searchDisplayController.delegate = nil;
self.searchDisplayController.searchResultsDelegate = nil;
self.searchDisplayController.searchResultsDataSource = nil;
self.tableView.delegate = nil;
self.tableView.dataSource = nil;    
}

如果这解决了您的问题,请告诉我。


1
谢谢回答!它起作用了!我发现如果我们像这样写-(void)dealloc{ self.tableView; /*or self.view;*/ },它也可以工作...但我认为这不是最好的解决方案。 - archanger
2
+1 为节省大量人们的时间而欣喜!在我的情况下,我还必须将 tableHeaderView(其中包含 searchBar)设置为 nil。 - de.
这对我不起作用,我已经释放了所有东西,但是searchDisplayController在dealloc时仍然崩溃。代码运行良好,只有在单元测试期间才会出现此问题。我无论如何都想不通为什么会这样。 - Woodmister1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接