我通常在-viewDidLoad中创建并附加UIGestureReconizers.我应该在-viewDidUnload中使用removeGestureRecognizer吗?还是自动删除?
例如,它是创建UIGestureRecognizer属性并在viewController的init方法中初始化它的更好方法,然后在-viewDidAppear / -viewDidDisappear中附加/删除此gestureRecognizer属性?
(注意我正在使用ARC)
谢谢.
解决方法
所以,假设你添加了一个tap识别器.在这种情况下,您不需要再次访问识别器.我会这样创建它:
-(void)viewDidLoad{ [super viewDidLoad]; UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)]; [self.view addGestureRecognizer:tap]; }
在这种情况下,您无需管理此识别器.观点系统坚持参考.你所做的只是坐下来等待它来调用handleTap:.当视图卸载时,此分解识别器将被释放.
在viewWillAppear中添加此识别器的情况也不是很好:由于不难想象会导致创建多个识别器的一系列事件.
所以在逻辑上,如果你想在外观方法中添加一个识别器,你将不得不在一个ivar中对它们进行一些引用.但再一次并不总是一个坏主意.通常,您希望引用识别器的原因在于帮助您了解< UIGestureRecognizerDelegate>的逻辑.方法,如果它们被使用.
我个人永远不会在initWith ..方法中添加一个识别器,以便以后进行附件.唯一的优点是您在该处创建的任何识别器都将保留在视图控制器的整个生命周期中.但是由于识别器很明显地是视觉系统的一部分,这种混合了可可大的MVC.同样在低内存条件下,导航堆栈上的控制器的视图被清除,但在这种情况下,识别器可能会没有真正的原因保留使用内存(不是那么大的对象).
你肯定可以在视图中添加一个识别器(Will / Did)显示:方法并将其删除(Will / Did)消失:.不是我的偏好我不认为只是因为提出和删除了模态视图,或者导航推送/弹出已经发生,我应该删除并重新添加我的识别器.
我建议几乎总是使用viewDidLoad来实例化和附加你的识别器.只要记住在viewDidUnload中清除任何对它们的强烈引用,以帮助在低内存情况下.再次与ARC,在dealloc中没有必要对ivars做任何事情.