繁体   English   中英

这种情况会形成一个强大的参考周期吗?

[英]Will this situation create a strong reference cycle?

public class somethingViewController{
    func viewDidLoad(){
        let contentImageView = UIImageView()
        let contentImageViewTapRecognizer = UITapGestureRecognizer(target: self, action: #selector(somethingViewController.tapped(_:)))
        contentImageView.addGestureRecognizer(contentImageViewTapRecognizer)
        let stackView = OAStackView(arrangedSubviews: [contentImageView])
        self.view.addSubview(stackView)
    }
    func tapped(sender: UITapGestureRecognizer){
        //tapped
    }
}

我认为这不是一个很强的参考周期,但是我可能错了。 我认为这可能是一个很强的参考周期的原因是因为stackView指向contentImageView ,后者通过拍打识别器中的选择器指向somethingViewController

如果这是一个强参考周期,我该如何解决该问题?

没有强大的周期,就没有问题。 target-action模式中 ,控件将不会保留目标:

控制对象不(也不应)保留其目标。 但是,发送操作消息的控件的客户端(通常是应用程序)负责确保其目标可用于接收操作消息。 为此,他们可能必须将其目标保留在内存管理的环境中。 此预防措施同样适用于代表和数据源。

这意味着从手势识别器到视图控制器没有强大的参考。

整个周期:

self 
 ↳ self.view (strong)
    ↳ stackView (strong, via subviews)
       ↳ contentImageView (strong, via subviews)
          ↳ contentImageViewTapRecognizer (strong, via gestureRecognizers)
             ↳ self (**weak**, via target)

这将一直保留到您的班级进入导航堆栈或直到您的班级还活着为止(我的意思是未销毁)。 因此,您可以说它是strong reference但不是strong reference cycle 如果您在其上推入或显示另一个视图控制器,则它位于内存中并且可以。 这是正常现象。 因此, there is nothing wrong in it因此您无需解决任何问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM