Cocoa touch 解除分配对象获取UIgestureRecognitor消息

Cocoa touch 解除分配对象获取UIgestureRecognitor消息,cocoa-touch,ipad,Cocoa Touch,Ipad,我有一个视图,当接收到双击时,它会向根控制器发送一个通知,根控制器会依次删除和释放该视图 问题在于,在释放视图后,它会收到另一个延迟的GestureRecognitor事件 以下是来自“仪器”的信息: Category Event Type RefCt Timestamp Address Size Responsible Library Responsible Caller UIScrollView Zombie -1 00:06.

我有一个视图,当接收到双击时,它会向根控制器发送一个通知,根控制器会依次删除和释放该视图

问题在于,在释放视图后,它会收到另一个延迟的GestureRecognitor事件

以下是来自“仪器”的信息:

Category        Event Type  RefCt   Timestamp   Address      Size   Responsible Library Responsible Caller
UIScrollView    Zombie          -1  00:06.166   0x55496a0    0                   UIKit  -[UIGestureRecognizer _updateGestureWithEvent:]


   0 CoreFoundation ___forwarding___
   1 CoreFoundation _CF_forwarding_prep_0
   2 UIKit -[UIGestureRecognizer _updateGestureWithEvent:]
   3 UIKit -[UIGestureRecognizer _delayedUpdateGesture]
   4 UIKit _UIGestureRecognizerUpdateObserver
   5 UIKit _UIGestureRecognizerUpdateGesturesFromSendEvent
   6 UIKit -[UIWindow _sendGesturesForEvent:]
   7 UIKit -[UIWindow sendEvent:]
   8 UIKit -[UIApplication sendEvent:]
   9 UIKit _UIApplicationHandleEvent
  10 GraphicsServices PurpleEventCallback
  11 CoreFoundation CFRunLoopRunSpecific
  12 CoreFoundation CFRunLoopRunInMode
  13 GraphicsServices GSEventRunModal
  14 GraphicsServices GSEventRun
  15 UIKit UIApplicationMain
  16 ipadapp main /Users/test/Projects/app/ipadapp/main.m:7
  17 ipadapp start
UIScrollView似乎在正确的时间发布


问题是为什么会出现这个额外的手势事件。

根据定义,延迟的手势会在稍微延迟后发送。此(UIScrollViewDelayedTouchesbegangesturererecognizer)用于确保捏和平移手势获得更高的优先级

手势识别器不会保留其状态以避免保留循环。因此,当此识别器启动时,它将发送到解除分配的视图


您可以延迟视图的
-release
(例如,使用
-performSelector:withObject:afterDelay:
)。或者,您可以将视图设置为隐藏,而不是删除视图。我不知道我是否遇到了完全相同的问题,但下面是我为我的问题所做的:

1-在Xcode中获取精确的消息,以确保您看到的是正确的位置。 之后,您将收到如下消息: [概述GestureRecognitzerFailed:]:消息已发送到解除分配的实例0x53d6d00

2-现在您已经知道了确切的问题,请在删除该对象之前取消激活该对象上的手势:

    // I have to remove the gestures, because a GesturerecongizerFailed can arrive after the view has been deallocated
    for (UIGestureRecognizer* gesture in self.overView.gestureRecognizers) {
        NSLog(@"Desactive un gesture");
        gesture.delegate = nil ; 
        gesture.enabled = NO;
    }
    // Remove the view from the display
    [self.overView removeFromSuperview];
    self.overView = nil;
这应该能奏效

[编辑]
另一个对我有效的解决方案:不要对手势识别器使用“自动释放”。在大多数情况下,您可以在将识别器添加到视图后直接释放识别器。

简单地执行此操作是否有任何错误:

if (gestureRecognizer) {
    if ((touch.view == UIButtonTypeCustom)) {
        return NO;
    }
    return YES;
} else return NO;

在控制器解除分配后,手势识别器似乎正在向控制器发送回调。解除分配控制器之前,请确保将手势识别器从附加到的视图中删除

在控制器类中,您可能会设置手势识别器,如下所示:

- (void)loadView {
    [super loadView];
    _view = [[UIView alloc] init];
    _doubleTapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(_handleDoubleTap:)];
    [_view addGestureRecgonizer:_doubleTapGestureRecognizer];
}
因此,请确保在控制器的解除锁定方法中移除手势识别器:

- (void)dealloc {
    [_view removeGestureRecognizer:_doubleTapGestureRecognizer];
    [_doubleTapGestureRecognizer release];
    [_view release];
    [super dealloc];
}

这是我如何解决这个问题的一个显而易见的解决办法。。确保释放您的实际视图。我的视图有很多子视图,我正在发布这些子视图,但我没有发布我的实际视图。在我做了之后,程序很好。

谢谢你的回答。我发现你的两个选项听起来都有点像糟糕的解决办法(无意冒犯…)-难道没有办法告诉手势识别器删除所有待处理的消息吗?我已尝试在手势识别器上调用“removeTarget”,在视图上调用“RemoveGetResognixer”,但仍然没有成功。@LK:您是否尝试将
.gestureRecognizers
设置为零?实际上没有解决此问题。。。即使有一点耽搁,我还是收到了。从那以后有什么反应吗?我有同样的问题,如果使用它们作为iboutlet,请确保它们是弱的,然后在使用完属性后,如果需要,将其置零。与上面的编辑相同,但对某些人来说可能不明显。