这种情况是否会产生强大的参考周期?

时间:2016-06-01 06:44:43

标签: ios swift memory

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

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

2 个答案:

答案 0 :(得分:4)

没有强大的循环,没有问题。在target-action pattern中,控件不会保留目标:

  

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

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

整个周期:

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

答案 1 :(得分:0)

这将保持到你的班级在导航堆栈中或直到你的班级还活着我的意思是没有被摧毁。因此,您可以说strong reference但不是strong reference cycle。如果您在其上推或显示另一个视图控制器,那么它就在内存中并且没有问题。这是正常行为。所以,there is nothing wrong in it所以你不需要解决任何问题。