UIGestureRecognizer导致循环保留?

时间:2013-01-30 20:19:49

标签: ios cocoa-touch uigesturerecognizer

我在想,如果您在手势识别器的self方法中将目标指定为initWithTarget:action:,您会导致循环保留吗?由于self会在self.gestureRecognizers中保留识别符,因此手势识别器也可以在initWithTarget:action中保留自我。

以下是解决方案吗?

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

2 个答案:

答案 0 :(得分:16)

我完全理解确认缺少文档的东西会让人感到不安。需要注意的重要一点是,通过十多年的惯例,目标 - 行动关系永远不会strong。这是the relevant docs。请注意以下部分:

  

控制对象不会(也不应该)保留其目标。

“保留......”采用MRC的方式说“持有strong对...的引用”

鉴于这是此类交互的文档约定,可以安全地假设,如果UIGestureRecognizer的目标操作实现 保留了对象,那么异常会很奇怪它将出现在它的文档中。


P.S。您不必担心引用控件在内存管理环境中保留目标的注释。 “内存管理”是指Cocoa中的(现在已被删除的)垃圾收集。 MRC或ARC都不受内存管理。

答案 1 :(得分:3)

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

这不保留自我。它也是noted in the docs

您需要为视图添加识别器。该视图将保留识别器。没有保留周期。

[aView addGestureRecognizer:tapRec];

addGestureRecognizer: docs请注意,视图会保留识别器


当你使用ARC时,这就是你所要做的一切

UIGestureRecognizer* tapRec = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
[aView addGestureRecognizer:tapRec];