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