ios:uiviewcontroller的主视图什么时候会被取消分配?

时间:2014-12-30 07:51:31

标签: ios uigesturerecognizer exc-bad-access

我们知道UIViewController类维护它的主视图实例(self.view)。我有一个带有手势识别器的tableview(self.view的子视图)。该手势识别器的目标是viewcontroller。但是我在崩溃日志中发现了一个糟糕的访问权限(它不会出现在我自己的设备上)。

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

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

2 个答案:

答案 0 :(得分:0)

@phang九洲,

我认为在ARC中self.view是我们创建的每个viewController子类中的弱属性。所以每当viewController实例设置为nil时。它解除了它所拥有的所有弱势属性。所以当使用ARC进行defalut self.view时,无需担心视图。

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

我希望它会对你有所帮助。

答案 1 :(得分:0)

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

例如,如果你设置你的手势识别器:

- (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];
}