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