3

我在 iOS 7 中使用新的 uisearchbar 时遇到了一些问题。

在我的应用程序中,在 tableHeaderView 中有一个带有搜索栏的 tableview。

它是手工制作的(以编程方式添加)-情节提要中的 tableviewcontroller,在 viewDidLoad 方法中,我使用从 UISearchBar 继承的自定义搜索栏添加了 searchDisplayController。

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

在我的应用程序的逻辑中,我有时会发布这个导航控制器发送dismissViewController。

在 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?它来自哪里以及如何处理它?

4

1 回答 1

17

iOS 7 确实改变了一些关于 tableviews 及其委托的规则。当然,这并没有在容易找到的地方突出显示。

但基本上,在早期版本的 iOS 中,您可以选择取消 tableView 委托和数据源。不这样做不会发送任何错误消息。

从 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;    
}

让我知道这是否解决了您的问题。

于 2013-09-19T12:19:15.670 回答