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->方案 – >编辑方案 – >诊断 – >启用僵尸对象).这里的目标是让您的程序更快崩溃.一旦您尝试访问取消分配的实例,这将使您进入调试器.有时,这将指向正确的方向,有时不是,但总是更好地将其检测到尽可能靠近问题的地方.
下一步是使用僵尸仪器.这个工具会给你比上一步更多的信息,但使用起来比较复杂(这就是为什么我做了第二步而不是第一步).僵尸工具将跟踪您的所有分配和版本,并检测您何时尝试访问僵尸对象.
最后的手段是开始注释代码.首先注释您的程序在创建视图控制器(崩溃的那个)和释放之前执行的所有操作.然后运行程序,做任何你需要做的,使它显示坏视图控制器.它不会做任何事情,显然,因为它现在只是一个空的视图控制器,但它不应该崩溃).然后开始取消注释代码块,一次一点点,并在每次迭代之间继续运行它.这是一个重复的过程,如果您的视图控制器代码庞大而复杂,则可能很乏味.但是这个想法是继续添加代码,直到你添加一些东西并且它崩溃 – 然后你知道你已经找到导致问题的代码片段.你必须在这里有创意,仔细选择如何把你的代码放回来 – 如果你的程序有一个很好的模块化设计,你应该能够做到这一点没有太多的麻烦.意大利面代码将很难做到这一点,但它可能会为您提供一个很好的机会,在您进行代码重组时.通过这个过程,您将缩小问题,并最终通过消除过程找到错误.