我有一种观点,即在接收双击时,向根控制器发送通知,根控制器依次删除并释放视图.
问题是在视图发布后,它会收到另一个延迟的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似乎在正确的时间发布.
问题是这个额外的手势事件到来的原因.
我不知道我是否有完全相同的问题,但这是我为我做的:
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'用于手势识别器.在大多数情况下,您可以在将识别器添加到视图后直接释放识别器.
根据定义,延迟手势是在稍微延迟后发送的。此 (UIScrollViewDelayedTouchesBeganGestureRecognizer) 用于确保捏合和平移手势获得更高的优先级。
手势识别器不会保留其状态以避免保留周期。因此,当该识别器触发时,它将发送到已释放的视图。
您可以延迟-release视图的时间(例如使用-performSelector:withObject:afterDelay:)。或者您可以设置它,而不是删除视图hidden。
| 归档时间: |
|
| 查看次数: |
4302 次 |
| 最近记录: |