我在想,如果您在手势识别器的self
方法中将目标指定为initWithTarget:action:
,您会导致循环保留吗?由于self
会在self.gestureRecognizers
中保留识别符,因此手势识别器也可以在initWithTarget:action
中保留自我。
以下是解决方案吗?
__weak VRDrawer* weakSelf = self;
UIGestureRecognizer* tapRec = [[UITapGestureRecognizer alloc] initWithTarget:weakSelf
action:@selector(handleTap:)];
答案 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];