Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/115.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS 7.1从SuperView崩溃中移除_Ios_Objective C_Subview_Ios7.1 - Fatal编程技术网

iOS 7.1从SuperView崩溃中移除

iOS 7.1从SuperView崩溃中移除,ios,objective-c,subview,ios7.1,Ios,Objective C,Subview,Ios7.1,在iOS 7.1推出之前,我的应用程序没有任何崩溃。现在在任何removeFromSuperview方法上,崩溃。例如:我得到了视图控制器,当我想要删除视图控制器时,我会删除它的所有子视图,然后从堆栈中删除(堆栈:我将视图控制器存储在其中,用于加载新内容和加载以前的内容): 我得到了 -[CALayer retain]:发送到解除分配实例的消息 信息 [actual removeFromParentViewController]; 是移除它的好方法吗?它会释放整个视图控制器及其子视图吗?因为我

在iOS 7.1推出之前,我的应用程序没有任何崩溃。现在在任何
removeFromSuperview
方法上,崩溃。例如:我得到了视图控制器,当我想要删除视图控制器时,我会删除它的所有子视图,然后从堆栈中删除(堆栈:我将视图控制器存储在其中,用于加载新内容和加载以前的内容):

我得到了

-[CALayer retain]:发送到解除分配实例的消息

信息

[actual removeFromParentViewController];
是移除它的好方法吗?它会释放整个视图控制器及其子视图吗?因为我的应用程序没有从SuperView中移除,而是不会崩溃。我不明白iOS 7.1中发生了什么变化

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

更新:

有时因以下原因而崩溃:

[myactualviewcontroller.view removeFromSuperview];
[myactualviewcontroller.view removeFromSuperview];
-[CALayer retain]:发送到解除分配实例的消息

为什么

有时,如果我试图从视图控制器视图中删除主子视图,它也会发生同样的崩溃:

[mainView从SuperView移除]
(mainView是一个单一的UIView,添加到vc.view中)

更新2:(详细说明)

所以,我有一个容器视图。我正在将
UIViewController.view
添加到此容器。我正在将一个视图作为子视图添加到
UIViewController.view
。此视图不是本地uiview,我的意思是,它声明为
实现{uiview*mainView}
。当我的UIViewController将被解除分配时,在其
-(void)dealloc{[mainView removeFromSuperview];[mainView release][super dealloc];}

在主视图中,从SuperView移除我的应用程序崩溃。

已更新

尝试这样做:

NSArray *subviews = [NSArray arrayWithArray:[contentVc subviews]];
for (UIView *subView in subviews)
     [subView removeFromSuperview];
我认为您遇到了崩溃,因为您试图快速枚举具有可变长度的数组(事实上,当您删除子视图时,它也会从子视图数组中删除)

如果要删除viewcontroller,只需调用:

[contentVc.view removeFromSuperView];
[contentVc removeFromParentViewController];

在快速枚举数组时修改数组通常不是一个好主意。您似乎正在对视图的子视图数组使用快速枚举,并同时修改该数组(通过在执行过程中删除子视图)。您可以尝试以下方法:

NSArray *subviewsCopy = [[contentVc subviews] copy];
for (UIView *subview in subviewsCopy) {
    [subview removeFromSuperview];
}
但是,正如其他一些人所提到的,需要手动删除这些子视图有点奇怪。在正常情况下,解除分配视图控制器本身时,视图控制器的视图(及其下的视图层次)将自动清理

还有一些好的工具可以帮助您追踪问题的根源。特别是,您应该配置您的应用程序(在Xcode中,在产品菜单下),并在Instruments提示时选择Zombies工具。使用Zombies,您可以查看对象的保留/释放历史,该对象在解除分配后被发送消息


如果您试图手动清理视图层次结构,因为您怀疑您的视图会被泄漏,我建议您也在Instruments中尝试泄漏工具,并验证当禁用此代码时,相关视图是否实际泄漏。

请执行以下操作:

1-调试(UIView*子视图在[contentVc子视图]中)的
并检查其迭代次数

如果它在第一次点击时没有崩溃,您可以在删除视图之前添加这一行
if(subView.superView!=nil)

否则,请尝试确保您不会在其他地方发布两次视图 继续显示,直到您将其从superview中删除后才会崩溃

更新2: 我会考虑你会意识到内存泄漏,并且你有很好的经验。
  • 无论何时将子视图添加到视图中,都将在原始1的基础上保留对象1,该值等于2,然后在添加子视图后,必须直接释放该对象,这将使保留计数减回到1。诀窍在于:您不必释放子视图或将其从父视图中移除,就可以去掉剩余的保留计数。您只需删除或释放父视图即可。以NSMutableArray为例

  • 删除
    [mainView removeFromSuperview]
    解除锁定:
    方法。您可以将其添加到其他位置,如
    视图将消失:
    方法。dealloc方法不应包含发布调用以外的任何内容

有时因以下原因而崩溃:

[myactualviewcontroller.view removeFromSuperview];
[myactualviewcontroller.view removeFromSuperview];
您不应该手动从视图层次结构中添加或删除控制器的视图,而应该依靠
UIWindow
rootViewController
,将控制器推到
UINavigationController
等,以使系统将视图添加到私有的基础超级视图中。除非你创造了一个,我想你不是

如果您只想手动处理视图,请不要使用视图控制器,因为它们不会被系统保留,也不会获得任何旋转消息等。因此,在这种情况下,使用视图控制器毫无意义

至于子视图内存处理,子视图由它们的superview保留,因此只要不保留
strong
引用,就不需要释放子视图,只需删除一个公共superview即可

同样,如果正确使用视图控制器,只需释放该控制器即可删除所有视图


最后,您应该开始使用ARC。

您的程序正在崩溃,因为您不止一次地发布了某些内容。这一点是显而易见的

找到它的第一步是在调试器中启用僵尸检测。(
项目->方案->编辑方案->诊断->启用僵尸对象
)。这里的目标是使您的程序更快崩溃。这将使您尽快进入调试器
You are having like this,

for (UIView *subView in [contentVc subviews])
     [subView removeFromSuperview];
[[contentVc subviews] makeObjectsPerformSelector:@selector(removeFromSuperview)];
for (UIView *subView in subviews)
     [subView removeFromSuperview];
[subviews makeObjectsPerformSelector:@selector(@"removeFromSuperview");