我在想,如果分配目标作为self
的手势识别器的initWithTarget:action:
方法,你会导致循环挽留? 因为self
将保留在识别器self.gestureRecognizers
并有可能手势识别器还保留自我initWithTarget:action
。
将下面是它的解决方案?
__weak VRDrawer* weakSelf = self;
UIGestureRecognizer* tapRec = [[UITapGestureRecognizer alloc] initWithTarget:weakSelf
action:@selector(handleTap:)];
我完全理解,确认一些与缺少文档可以感觉到不安。 需要注意的重要一点是,通过在约定的十年,目标-动作的关系从来都不strong
。 下面是相关的文档 。 需要注意的是说,部分:
防治对象没有(也不应该)保留他们的目标。
“保留......”在说的MRC方式“举行一个strong
参考。”
鉴于这是该类型的交互的记录惯例,它是安全的假设,如果UIGestureRecognizer
的目标-动作执行并保留对象,异常就足够奇怪的是,它会在文档中显示。
PS你不必担心是指保留在内存管理环境指标控制的说明。 “内存管理”是指在可可(现在depricated)垃圾收集。 无论是MRC或ARC是内存管理。
UIGestureRecognizer* tapRec = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
这不保留自我。 它也将在文档中指出
你需要一个识别器添加到视图。 这种观点将保留识别。 没有保留周期。
[aView addGestureRecognizer:tapRec];
addGestureRecognizer:
文档不提,该视图保留识别
当你正在使用ARC,这是所有你需要做的
UIGestureRecognizer* tapRec = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
[aView addGestureRecognizer:tapRec];