本质上,您可以在有意义的情况下创建、添加和删除手势识别器。并且“何时有意义”取决于一些事情,但通常仅取决于您是否将它们保留为 ivars。关键ARC
是管理强引用;默认情况下,使用ARC
ivars 很强大。
因此,假设您添加了一个水龙头识别器。在这种情况下,您不需要再次访问识别器。我会这样创建它:
-(void)viewDidLoad{
[super viewDidLoad];
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
[self.view addGestureRecognizer:tap];
}
在这种情况下,您无需执行任何其他操作来管理此识别器。视图系统对它有很强的参考。你所做的就是坐等它来电handleTap:
。当视图卸载时,这个点击识别器将被释放。
这种情况也不适合添加此识别器,viewWillAppear:
因为不难想象会导致创建多个识别器的一系列事件。
因此,从逻辑上讲,如果您想在外观方法中添加识别器,则必须在 ivar 中对它们进行某种引用。但同样,这并不总是一个坏主意。通常,您希望引用识别器的原因是帮助<UIGestureRecognizerDelegate>
方法的逻辑(如果使用它们)。
我个人以后永远不会在initWith..
附件方法中添加识别器。唯一的优点是您在那里创建的任何识别器都将保留在视图控制器的整个生命周期中。但是,由于识别器显然是视图系统的一部分,所以这种混淆了MVC
Cocoa 的优势。同样在内存不足的情况下,导航堆栈上的控制器视图会被清除,但在这种情况下,识别器可能会无缘无故地继续使用内存(不是存在巨大的对象)。
您当然可以在方法中添加识别view(Will/Did)Appear:
器,然后在view(Will/Did)Disappear:
. 不是我的偏好。我不认为仅仅因为一个modal
视图被呈现和删除或者导航push
/pop
已经发生,我应该删除并重新添加我的识别器。
我建议几乎总是使用viewDidLoad
来实例化和附加你的识别器。只要记住消除对它们的任何强引用,viewDidUnload
以帮助解决内存不足的情况。再一次,ARC
在 dealloc 中不需要对 ivars 做任何事情。