ios: uiviewcontroller 的主视图啥时候会被释放?

Posted

技术标签:

【中文标题】ios: uiviewcontroller 的主视图啥时候会被释放?【英文标题】:ios: when will the main view of uiviewcontroller be dealloced?ios: uiviewcontroller 的主视图什么时候会被释放? 【发布时间】:2014-12-30 07:51:31 【问题描述】:

我们知道 UIViewController 类维护它的主视图实例(self.view)。我有一个带有手势识别器的表格视图(self.view 的子视图)。这个手势识别器的目标是视图控制器。但是我在崩溃日志中发现了一个错误的访问(它没有出现在我自己的设备上)。

CrashDoctor Diagnosis: Possible zombie in call: -[MTConversationViewController tableViewDidBeingTouched:UITapGestureRecognizer (instance)]

我猜当视图控制器被释放时,视图还没有被释放,它的子视图。视图控制器在目标方法中变成了僵尸。对吗?我们是否应该在 dealloc 方法中将所有子视图设置为 nil 以避免委托/目标方法中的错误访问?

【问题讨论】:

你能分享你的代码吗? 【参考方案1】:

您的手势识别器可能会在您的控制器被释放后向您的控制器发送回调。只需确保在释放控制器之前从附加的视图中删除手势识别器即可。

例如,如果您这样设置手势识别器:

- (void)loadView 
    [super loadView];
    _gesture = [[UITapGestureRecognizer alloc] initWithTarget:self action@selector(gestureHandler:)];
    [view addGestureRecognizer:_gesture];

然后在 ViewController 的 dealloc 中移除手势识别器:

- (void)dealloc 
    [view removeGestureRecognizer:_gesture];
    [_gesture release];
    [view release];
    [super dealloc];

【讨论】:

【参考方案2】:

@张九洲,

我认为在 ARC 中,self.view 在我们创建的每个 viewController 子类中都是弱属性。因此,每当 viewController 实例设置为 nil 时。它释放了它拥有的所有弱属性。所以在使用 ARC 默认 self.view 时无需担心视图。

对于自定义视图,我们需要使用 [view removeFromSuperView] 删除它们;从视图层次结构中正确删除它们。然后将 viewController 实例设置为 nil。

希望对你有帮助。

【讨论】:

但是如何解释这个崩溃呢?视图控制器被释放,但视图可以接收触摸并调用目标方法。它崩溃了,因为视图控制器被释放并变成了 zonbie。

以上是关于ios: uiviewcontroller 的主视图啥时候会被释放?的主要内容,如果未能解决你的问题,请参考以下文章

在iOS中单击按钮弹出uiview

没有 modal、tabbar 和 navigationcontroller 的 UIViewController 工作流管理?

是否可以在不同的 UIStoryBoard 的 UIViewController 中使用 UIStoryBoard?

在 UIViewController 的主视图中加载自定义 UIView

在 iOS 8 splitviewcontroller 主视图控制器不会在旋转时调整高度

iOS Push UIViewController 像 Snapchat 这样的滑动手势