我在想,如果在手势识别器的initWithTarget:action:
方法中将目标指定为self
,会不会造成循环保留?由于 self
将在 self.gestureRecognizers
中保留识别器,并且手势识别器也可能在 initWithTarget:action
中保留 self。
下面会是解决方案吗?
__weak VRDrawer* weakSelf = self;
UIGestureRecognizer* tapRec = [[UITapGestureRecognizer alloc] initWithTarget:weakSelf
action:@selector(handleTap:)];
最佳答案
我完全理解在缺乏文档的情况下确认某些事情会让人感到不安。需要注意的重要一点是,根据十多年的惯例,目标- Action 关系永远不会强
。这是 the relevant docs .请注意以下部分:
Control objects do not (and should not) retain their targets.
“保留……”在 MRC 中表示“持有对……的 strong
引用”
鉴于这是此类交互的记录约定,可以安全地假设,如果 UIGestureRecognizer
的目标操作实现确实保留了对象,那么异常将足够奇怪,它会出现在它的文档中。
附言您不必担心在内存管理环境中引用控件保留目标的注释。 “内存管理”指的是 Cocoa 中的(现在已经过时的)垃圾收集。 MRC 或 ARC 都不是内存管理的。
关于ios - UIGestureRecognizer 导致循环保留?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14612916/