iOS 7.1 removeFromSuperview崩溃

我的应用程序没有任何崩溃,直到iOS 7.1出来.现在在任何removeFromSuperview方法,崩溃.例如:我有视图控制器,当我想删除一个视图控制器时,我删除所有的子视图,然后从堆栈中删除(堆栈:我正在存储视图控制器,加载新的内容,并加载以前的内容):
for (UIView *subView in [contentVc subviews])
         [subView removeFromSuperview];

我得到了

-[CALayer retain]: message sent to deallocated instance

信息

[actual removeFromParentViewController];

删除它的好方法吗?它会释放整个视图控制器及其子视图吗?因为而不是removeFromSuperview,我的应用程序不会崩溃.我不明白iOS 7.1中有什么变化.

如何删除viewController中没有removeFromSuperview的所有子视图,而不删除我的ViewController(如果我只想添加新的子视图,并删除当前的内容)?

更新:

有时会崩溃:

[myactualviewcontroller.view removeFromSuperview];

-[CALayer retain]: message sent to deallocated instance

为什么???

有时如果我尝试从视图控制器视图中删除主子视图,它的崩溃也是一样的:

[mainView removeFromSuperview](mainView是单个UIView,添加到vc.view)

UPDATE2 :(详细)

所以我有一个容器视图.我添加一个UIViewController.view到这个容器.而且我添加一个视图作为UIViewController.view的子视图.这个视图不是本地的uiview,我的意思是,它被声明为实现{UIView * mainView}.当我的UIViewController将被释放时,在其 – (void)dealloc {[mainView removeFromSuperview]; [mainView release] [super dealloc];}
在mainView removeFromSuperview我的应用程序崩溃.

解决方法

您的程序崩溃,因为您正在发布不止一次.那部分是显而易见的.

找到它的第一步是在调试器中启用僵尸检测. (Project->方案 – >编辑方案 – >诊断 – >启用僵尸对象).这里的目标是让您的程序更快崩溃.一旦您尝试访问取消分配的实例,这将使您进入调试器.有时,这将指向正确的方向,有时不是,但总是更好地将其检测到尽可能靠近问题的地方.

下一步是使用僵尸仪器.这个工具会给你比上一步更多的信息,但使用起来比较复杂(这就是为什么我做了第二步而不是第一步).僵尸工具将跟踪您的所有分配和版本,并检测您何时尝试访问僵尸对象.

最后的手段是开始注释代码.首先注释您的程序在创建视图控制器(崩溃的那个)和释放之前执行的所有操作.然后运行程序,做任何你需要做的,使它显示坏视图控制器.它不会做任何事情,显然,因为它现在只是一个空的视图控制器,但它不应该崩溃).然后开始取消注释代码块,一次一点点,并在每次迭代之间继续运行它.这是一个重复的过程,如果您的视图控制器代码庞大而复杂,则可能很乏味.但是这个想法是继续添加代码,直到你添加一些东西并且它崩溃 – 然后你知道你已经找到导致问题的代码片段.你必须在这里有创意,仔细选择如何把你的代码放回来 – 如果你的程序有一个很好的模块化设计,你应该能够做到这一点没有太多的麻烦.意大利面代码将很难做到这一点,但它可能会为您提供一个很好的机会,在您进行代码重组时.通过这个过程,您将缩小问题,并最终通过消除过程找到错误.

相关文章

UITabBarController 是 iOS 中用于管理和显示选项卡界面的一...
UITableView的重用机制避免了频繁创建和销毁单元格的开销,使...
Objective-C中,类的实例变量(instance variables)和属性(...
从内存管理的角度来看,block可以作为方法的传入参数是因为b...
WKWebView 是 iOS 开发中用于显示网页内容的组件,它是在 iO...
OC中常用的多线程编程技术: 1. NSThread NSThread是Objecti...