簡體   English   中英

這種情況會形成一個強大的參考周期嗎?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM