UIView 帧发送到释放的实例

Posted

技术标签:

【中文标题】UIView 帧发送到释放的实例【英文标题】:UIView frame sent to deallocated instance 【发布时间】:2013-09-05 00:21:22 【问题描述】:

我目前正在开发一个应用程序,该应用程序有一些 ViewController,上面有一个按钮,可以推送到带有搜索栏和搜索显示控制器的 UITableViewController。我在单元格中有一些数据并且会被填充。我添加了以下代码来隐藏搜索栏,并在您看到它时使其变得清晰:

[[self.searchBar.subviews objectAtIndex:0] removeFromSuperView];
[self.searchBar setBackgroundColor:[UIColor clearColor]];
CGRect newBounds = [[self tableView]bounds];
newBounds.origin.y = newBounds.origin.y + searchBar.bounds.size.height;
[[self tableView] setBounds:newBounds];

现在,当我使用 ios 模拟器时,这可以工作,但是当我在设备上运行它并开始向上或向下滚动时,它会崩溃并给我以下错误:

EXC_BREAKPOINT (code = EXC_ARM_BREAKPOINT, subcode = 0xdefe)

然后我启用了 Zombie Objects 以进一步调试并得到了这个:

-[UIView frame]: message sent to deallocated instance 0x156b1430

当我起飞时:

[[self.searchBar.subviews objectAtIndex:0] removeFromSuperView];
[self.searchBar setBackgroundColor:[UIColor clearColor]];

然后再次在我的设备上运行我的应用程序,它不会崩溃并且工作正常。

任何人都知道发生了什么以及这是如何发生的?提前致谢!

【问题讨论】:

为什么我被否决了?这是一个诚实的问题。很抱歉,如果这是重复/转发,我尝试搜索并没有找到任何内容。 您使用的是哪个 ios 版本??你在使用objective c自动引用计数吗?? @KamalSharma 我的模拟器在 iOS 6.1 上运行,我的设备在 iOS 7 上。是的,我正在使用 ARC。 【参考方案1】:
    [[self.searchBar.subviews objectAtIndex:0] removeFromSuperView]; 

    //This Line remove search bar from view ,which means it is deallocated at that moment so when you again try to remove it ,,the app crash ..
  //  So,instead of this try to hide searchbar ,,

    Self. searchBar.hidden =YES;

【讨论】:

我不希望 searchBar 必须隐藏。我希望它是一种清晰的颜色,以便与表格视图的背景颜色融为一体。【参考方案2】:

我认为 UISearchBar 有 [self.searchBar.subviews objectAtIndex:0]; 的不安全引用

然后你设置UITableView的边界然后改变UITableView的框架。 它会触发自动调整大小和layoutSubviews

所以,UISearchBar 的 layoutSubviews 方法访问[self.searchBar.subviews objectAtIndex:0].frame 用于布局或自动调整大小。

不建议从 SDK 更改 UIControls 中的视图。 有一个想法是设置hidden=YES而不是removeFromSuperview

【讨论】:

我不想隐藏我的搜索栏。我将它从框架中更改的原因是因为我不希望它在一开始就可见。我有一个启动搜索栏的按钮,即使其可见。用户还可以向上滚动表格视图,它就会出现。我使用[[self.searchBar.subviews objectAtIndex:0] removeFromSuperView]; 的原因是,如果我只输入[self.searchBar setBackgroundColor: [UIColor clearColor]];,它在模拟器和我的设备中都不起作用。【参考方案3】:

我遇到了同样的问题。转到此页面,阅读问题中的“僵尸对象”一词,并记得我已启用僵尸对象。禁用它们后,问题就消失了。现在,当我滚动我的 tableView 时,没有崩溃。

这可能很奇怪,但也许它会帮助某人......

【讨论】:

以上是关于UIView 帧发送到释放的实例的主要内容,如果未能解决你的问题,请参考以下文章

PKReveal 控制器 UIVIEW 无法识别的选择器发送到实例

[UIView collectionView:numberOfItemsInSection:]: 无法识别的选择器发送到实例

ViewController respondsToSelector:]: 消息发送到释放的实例

发送到已释放实例问题的消息

-[UIView setRegion:animated:]: 无法识别的选择器发送到实例

发送到已释放实例的消息