这种情况会造成强引用循环吗?

TIM*_*MEX 2 memory ios swift

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
    }
}
Run Code Online (Sandbox Code Playgroud)

我不认为这是一个强引用循环,但我可能是错的。我认为它可能是一个强引用循环的原因是因为stackView指向通过点击识别器中的选择器contentImageView返回的指向。somethingViewController

如果是强引用循环,该如何解决呢?

ken*_*ytm 6

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

\n\n
\n

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

\n
\n\n

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

\n\n

整个循环:

\n\n
self \n \xe2\x86\xb3 self.view (strong)\n    \xe2\x86\xb3 stackView (strong, via subviews)\n       \xe2\x86\xb3 contentImageView (strong, via subviews)\n          \xe2\x86\xb3 contentImageViewTapRecognizer (strong, via gestureRecognizers)\n             \xe2\x86\xb3 self (**weak**, via target)\n
Run Code Online (Sandbox Code Playgroud)\n