Ios UIgestureRecognitor导致循环保留?

Ios UIgestureRecognitor导致循环保留?,ios,cocoa-touch,uigesturerecognizer,Ios,Cocoa Touch,Uigesturerecognizer,我在想,如果在手势识别器的initWithTarget:action:方法中将目标指定为self,是否会导致循环保留?因为self将识别器保留在self.gestureRecograiners中,手势识别器也可能保留self在initWithTarget:action中 以下是解决方案吗 __weak VRDrawer* weakSelf = self; UIGestureRecognizer* tapRec = [[UITapGestureRecognizer alloc] initWithT

我在想,如果在手势识别器的
initWithTarget:action:
方法中将目标指定为
self
,是否会导致循环保留?因为
self
将识别器保留在
self.gestureRecograiners
中,手势识别器也可能保留self在
initWithTarget:action

以下是解决方案吗

__weak VRDrawer* weakSelf = self;
UIGestureRecognizer* tapRec = [[UITapGestureRecognizer alloc] initWithTarget:weakSelf
                                                                      action:@selector(handleTap:)];
这并不能保持自我。也会是

您需要向视图中添加识别器。该视图将保留识别器。无保留周期

[aView addGestureRecognizer:tapRec];
请注意,视图保留识别器


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

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

我完全理解确认一些缺少文档的东西会让人感到不安。需要注意的重要一点是,经过十多年的惯例,目标-行动关系从来都不强。给你。请注意以下部分:

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

“Retain…”用MRC的方式表示“持有对…的
strong
引用”

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



另外,您不必担心有关在内存管理环境中保留目标的控件的注释。“内存管理”指的是Cocoa中的(现在已消除摩擦的)垃圾收集。MRC或ARC都不是内存管理的。

您凭什么认为手势识别器会保留目标?在分配手势识别器的代码前后打印
[self-retainCount]
应该很简单,以查看它是否发生了变化。@GeoffHackworth:@GeoffHackworth我当然不知道它是否保留了目标,但由于文档中没有提到它,有人会问。@GeoffHackworth您是否意识到,
retainCount
的输出不可靠?你也知道你不能在ARC下使用它,对吗?如果你想知道…@GeoffHackworth,相信我:这个网站是对的-永远不要使用
retainCount
,即使不用于打印行调试。你在那页的哪里找到了信息?它肯定不在
addTarget:action:
下。没有信息就是信息。在技术上不需要在识别器中零售self。@Meda,如果识别器能够保留目标,它将在文档中。同时,在其他不太遥远的世界中,对于NSNotification Center来说,情况正好相反:“在解除分配addObserverForName:object:queue:usingBlock:指定的任何对象之前,必须调用removeObserver:或removeObserver:name:object:”。这就解释了为什么我在
dealloc
方法中的删除永远不起作用。
UIGestureRecognizer* tapRec = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
[aView addGestureRecognizer:tapRec];