我的应用程序没有发生任何崩溃,直到iOS 7.1出来。现在在任何removeFromSuperview
方法,崩溃。例如:我有视图控制器,当我想删除视图控制器时,我删除它的所有子视图,然后从堆栈中删除(堆栈:我在其中存储视图控制器,用于加载新内容,并加载之前的内容):
for (UIView *subView in [contentVc subviews])
[subView removeFromSuperview];
我得到了
-[CALayer保留]:发送到已释放实例的消息
message
[actual removeFromParentViewController];
有什么好的方法可以去除吗?它会释放整个视图控制器及其子视图吗?因为我的应用程序不会崩溃,而不是removeFromSuperview。我不明白 iOS 7.1 中发生了什么变化。
我怎样才能删除所有子视图viewController
没有removeFromSuperview
,并且无需删除我的ViewController
(如果我只想添加新的子视图,并删除当前的内容)?
UPDATE:
有时会崩溃:
[myactualviewcontroller.view removeFromSuperview];
-[CALayer保留]:发送到已释放实例的消息
Why???
有时,如果我尝试从视图控制器视图中删除主子视图,它会发生相同的崩溃:
[mainView removeFromSuperview]
( mainView 是单个 UIView,添加到 vc.view )
UPDATE2:(很详细)
所以,我有一个容器视图。我正在添加一个UIViewController.view
到这个容器。我将一个视图添加为子视图UIViewController.view
。这个视图不是本地 uiview,我的意思是,它声明为implementation{ UIView* mainView }
.当我的 UIViewController 将被释放时,在它的- (void) dealloc { [mainView removeFromSuperview]; [mainView release] [super dealloc];}
在 mainView removeFromSuperview 我的应用程序崩溃。
在快速枚举数组时修改数组通常不是一个好主意。您似乎正在对视图的子视图数组使用快速枚举,并同时修改该数组(通过随时删除子视图)。你可以尝试这样的事情:
NSArray *subviewsCopy = [[contentVc subviews] copy];
for (UIView *subview in subviewsCopy) {
[subview removeFromSuperview];
}
然而,正如其他一些人提到的,您需要费力手动删除这些子视图,这有点奇怪。在正常情况下,当视图控制器本身被释放时,视图控制器的视图(及其下的视图层次结构)将被自动清理。
还有一些很好的工具可以帮助您追踪问题的根源。特别是,您应该分析您的应用程序(在 Xcode 中的“产品”菜单下),并在 Instruments 提示您时选择“僵尸”工具。使用 Zombies,您可以查看释放后发送消息的对象的保留/释放历史记录。
如果您尝试手动清理视图层次结构,因为您怀疑视图会被泄露,我建议您还尝试 Instruments 中的 Leaks 工具,并验证当禁用此代码时相关视图是否确实被泄露。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)