17

我在想,如果您self按照手势识别器的 initWithTarget:action:方法分配目标,您会导致循环保留吗?由于self会将识别器保留在中self.gestureRecognizers,并且手势识别器也可能将自身保留在initWithTarget:action.

以下是解决方案吗?

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

2 回答 2

22

我完全理解在缺乏文档的情况下确认某些事情会让人感到不安。需要注意的重要一点是,按照十多年的惯例,目标-行动关系永远不会strong。这是相关文档。注意上面写着的部分:

控制对象不(也不应该)保留它们的目标。

“保留……”以 MRC 的说法“持有strong对……的引用”

鉴于这是此类交互的文档化约定,可以安全地假设,如果UIGestureRecognizer的 target-action 实现确实保留了对象,那么该异常会很奇怪,以至于它会出现在其文档中。


PS您不必担心有关在内存管理环境中控制保留目标的注释。“内存管理”是指 Cocoa 中的(现已弃用的)垃圾收集。MRC 或 ARC 都不是内存管理的。

于 2014-02-05T13:13:01.557 回答
4
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];
于 2013-01-30T20:32:29.973 回答