【问题标题】:UIGestureRecognizer causes circular retain?UIGestureRecognizer 导致循环保留?
【发布时间】:2013-01-14 19:04:39
【问题描述】:

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

以下是解决方案吗?

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

【问题讨论】:

  • 是什么让您认为手势识别器会保留目标?在分配手势识别器的代码之前和之后打印[self retainCount] 以查看它是否更改应该非常简单。
  • @GeoffHackworth: whentouseretaincount.com
  • @GeoffHackworth 当然我不知道它是否确实保留了目标,但由于文档没有提及它,人们应该想知道。
  • @GeoffHackworth 你意识到retainCount 的输出不可靠吧?你也知道不能在ARC下使用吧? __weak 表示我正在使用 ARC,以防你想知道...
  • @GeoffHackworth,相信我:这个网站是对的——永远不要使用retainCount,即使不是用于打印线调试。

标签: ios cocoa-touch uigesturerecognizer


【解决方案1】:

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

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

“保留...”在 MRC 中表示“持有strong 对...的引用”

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


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

【讨论】:

  • 同时,在其他不太遥远的世界中,对于 NSNoticationCenter 则相反:“您必须在 addObserverForName:object:queue 指定的任何对象之前调用 removeObserver: 或 removeObserver:name:object:: usingBlock: 被释放。”哪一种解释了为什么我在 dealloc 方法中的删除不起作用。
【解决方案2】:
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];

【讨论】:

  • 您在该页面的哪个位置找到了相关信息?它肯定不在addTarget:action: 之下。
  • 信息的缺失就是信息。没有技术需要在识别器中零售自我。
  • @Meda,如果识别器会保留目标,它将在文档中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多