2016-06-01 18 views
0
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這種情況會創建一個強大的參考週期嗎?

如果是強參考週期,我該如何解決問題?

+1

手勢識別不保持很強的參考他們的'target',所以因此也沒有很強的參考週期。 – Rob

+0

您可以編寫'#selector(tapped)'而不是全名'#selector(somethingViewController.tapped(_ :))'。 BTW類通常被命名爲'SomethingViewController',以大寫字母開頭。 – kennytm

回答

4

沒有強循環,沒有問題。在target-action pattern,控制不會保留目標:

控制對象沒有(也不應該)保留他們的目標。但是,發送操作消息(通常是應用程序)的控件的客戶端負責確保其目標可用於接收操作消息。要做到這一點,他們可能不得不在內存管理環境中保留目標。此預防措施同樣適用於代表和數據源。

這意味着沒有從手勢識別器到視圖控制器的強大參考。

整個週期:

self 
↳ self.view (strong) 
    ↳ stackView (strong, via subviews) 
     ↳ contentImageView (strong, via subviews) 
      ↳ contentImageViewTapRecognizer (strong, via gestureRecognizers) 
      ↳ self (**weak**, via target) 
0

這將一直存在,直到您的課程在導航堆棧中或直到您的課程還活着爲止我的意思是沒有被破壞。所以,你可以說它strong reference但不是strong reference cycle。如果你推動或呈現另一個視圖控制器,那麼它在內存中,它很好。這是正常的行爲。所以,there is nothing wrong in it所以你不需要解決任何問題。

+1

是意味着強烈的參照,而不是循環。對!更新答案! – Lion

相關問題