首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UIGestureRecognizer导致循环保留?

UIGestureRecognizer导致循环保留?
EN

Stack Overflow用户
提问于 2013-01-31 04:19:49
回答 2查看 4.8K关注 0票数 17

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

下面的方法能解决这个问题吗?

代码语言:javascript
复制
__weak VRDrawer* weakSelf = self;
UIGestureRecognizer* tapRec = [[UITapGestureRecognizer alloc] initWithTarget:weakSelf
                                                                      action:@selector(handleTap:)];
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-05 21:13:02

我完全理解,在没有文档的情况下确认某些事情会让人感到不安。需要注意的重要一点是,在十多年的约定中,目标-动作关系从来都不是strong。这是the relevant docs。请注意这部分内容:

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

“保留…”在MRC中,意思是“持有对…的strong引用”。

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

附注:您不必担心有关在内存管理环境中保留目标的控件的说明。“内存管理”指的是Cocoa中的垃圾回收(现已废弃)。MRC和ARC都不是内存管理的。

票数 22
EN

Stack Overflow用户

发布于 2013-01-31 04:32:30

代码语言:javascript
复制
UIGestureRecognizer* tapRec = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];

这不会保留自我。它也可以是noted in the docs

您需要将识别器添加到视图中。该视图将保留识别器。没有保留周期。

代码语言:javascript
复制
[aView addGestureRecognizer:tapRec];

addGestureRecognizer: docs确实提到过,视图保留了识别器

当您使用ARC时,这就是您要做的全部工作

代码语言:javascript
复制
UIGestureRecognizer* tapRec = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
[aView addGestureRecognizer:tapRec];
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14612916

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档