UIGestureRecognizer导致圆形挽留?(UIGestureRecognizer cau

2019-08-16 16:25发布

我在想,如果分配目标作为self的手势识别器的initWithTarget:action:方法,你会导致循环挽留? 因为self将保留在识别器self.gestureRecognizers并有可能手势识别器还保留自我initWithTarget:action

将下面是它的解决方案?

__weak VRDrawer* weakSelf = self;
UIGestureRecognizer* tapRec = [[UITapGestureRecognizer alloc] initWithTarget:weakSelf
                                                                      action:@selector(handleTap:)];

Answer 1:

我完全理解,确认一些与缺少文档可以感觉到不安。 需要注意的重要一点是,通过在约定的十年,目标-动作的关系从来都不strong 。 下面是相关的文档 。 需要注意的是说,部分:

防治对象没有(也不应该)保留他们的目标。

“保留......”在说的MRC方式“举行一个strong参考。”

鉴于这是该类型的交互的记录惯例,它是安全的假设,如果UIGestureRecognizer的目标-动作执行保留对象,异常就足够奇怪的是,它会在文档中显示。


PS你不必担心是指保留在内存管理环境指标控制的说明。 “内存管理”是指在可可(现在depricated)垃圾收集。 无论是MRC或ARC是内存管理。



Answer 2:

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];


文章来源: UIGestureRecognizer causes circular retain?