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


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

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

没有强循环,没有问题。在目标操作模式中,控件不会保留目标:

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

这意味着从手势识别器到视图控制器没有强引用。

整个周期:

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这样你就不需要解决任何问题。

最新更新