由于搜索显示控制器检测到僵尸,iOS 7应用程序崩溃

时间:2013-11-19 04:23:09

标签: ios iphone objective-c

NSZombieEnabled设置为YES,我的应用会在模拟器和设备上崩溃。在使用Instruments进行性能分析后,我已将问题缩小到我正在使用的搜索显示控制器:

  

Zombie Messaged:一个Objective-C消息被发送到一个deallocated   'UIView'对象(僵尸)地址:0x1134fb730“

     

事件类型ΔRefCtRefCt时间戳负责人图书馆负责人16 Zombie -1 00:25.897.720 UIKit - [UISearchDisplayController   _cleanUpSearchBar]

我已经在网上做了很多研究(包括搜索堆栈溢出),但还没有找到确切的原因。大多数人建议将搜索显示控制器上的代表设置为nil上的viewWillDisappear,我已经尝试过了。

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    self.searchDisplayController.delegate=nil;
    self.searchDisplayController.searchBar.delegate=nil;
}

我非常感谢任何人提供的任何帮助或提示。

2 个答案:

答案 0 :(得分:4)

另一个可能的原因是一个显然仍然潜伏在iOS 7.0.x中但在7.1中已修复的错误,如下所述:

https://devforums.apple.com/message/858259#858259(Apple dev论坛链接 - 需要开发会员资格)

如果您已将UISearchBar添加到TableView的tableHeaderView(如Apple的“表搜索”示例中所示),可能会发生这种情况,在这种情况下,解决方法是从那里删除它并告诉UISearchDisplayController显示搜索状态栏中的栏:

[self.searchDisplayController.searchBar removeFromSuperview];
self.searchDisplayController.displaysSearchBarInNavigationBar = YES;

唯一的缺点就是隐藏了表格的标题,但至少它没有崩溃。升级到7.1为我解决了问题。

答案 1 :(得分:1)

根据我所阅读的解决方案判断,取决于searchDisplayController @property的特征。

@property(nonatomic,retain) - 确保你在viewDidUnload中找不到UISearchDisplayController:

self.searchDisplayController = nil;

@property(非原子的,强大的) - 来自this answer,如果您尝试在属性很强的情况下尝试淘汰UISearchDisplayController,则可能会出现操作系统错误。所以请确保你:

    您在.m文件中
  1. @synthesize searchDisplayController;
  2. 将searchDisplayController设置为IBOutlet
  3. 如果这不起作用,请您从头文件中发布@property searchDisplayController声明吗?

    此外,我认为您不需要让搜索栏代表无所适从。