[英]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.