取消分配对象获取UIGestureRecognizer消息

LK.*_*LK. 5 cocoa-touch ipad

我有一种观点,即在接收双击时,向根控制器发送通知,根控制器依次删除并释放视图.

问题是在视图发布后,它会收到另一个延迟的GestureRecognizer事件.

以下是"仪器"的信息:

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
Run Code Online (Sandbox Code Playgroud)

UIScrollView似乎在正确的时间发布.

问题是这个额外的手势事件到来的原因.

Ced*_*rie 7

我不知道我是否有完全相同的问题,但这是我为我做的:

1- 在Xcode中启用Zombie模式以获取准确的信息,以确保您正在查看正确的位置.之后,您将收到如下消息:[OverView gestureRecognizerFailed:]:发送到解除分配的实例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;
Run Code Online (Sandbox Code Playgroud)

这应该可以解决问题.

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


ken*_*ytm 0

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

手势识别器不会保留其状态以避免保留周期。因此,当该识别器触发时,它将发送到已释放的视图。

您可以延迟-release视图的时间(例如使用-performSelector:withObject:afterDelay:)。或者您可以设置它,而不是删除视图hidden