2017-02-21 51 views
0

我基本上是用插座作爲弱變量,如在swift中,是否有必要在使用後將強變量設置爲零?

@IBOutlet weak var testButton: UIButton! 

但會發生什麼,如果我用強,而不是軟弱,像

@IBOutlet var testButton: UIButton! 

我必須在使用之後將其設爲零?

+0

其實強大的網點將保留在內存中。奧特萊斯不是可選項,所以你不能指定它們,否則你會崩潰。 –

+1

強壯將會在那裏,直到你自己創建的對象持有它。所以,回答你的問題「在使用它之後,是否有必要將強變量設置爲零?」 - > No. –

+0

http://scottberrevoets.com/2016/03/21/outlets-strong-or-weak/ –

回答

3

奧特萊斯弱都很好,只要他們在屏幕上的子視圖。實際上它們將被其superView的subviews數組保留。只要他們將從屏幕上移除(因此從subviews陣列)retainCount將減少1。如果出口的唯一強引用是在subviews陣列(弱屬性的情況下),那麼retainCount將是零,該對象將被釋放和您的testButton屬性將變得等於零。在這種情況下,您將永遠無法重用您的testButton屬性,因爲它是解壓的,任何訪問都會導致崩潰。如果可以以編程方式從屏幕上刪除視圖,則可以將此屬性設置爲?可選是個好主意。

你想要這個屬性來獲得強大的參考出口,如果你想編程刪除屏幕到此插座,並相繼重新將其添加爲編程基於一些用戶交互邏輯子視圖。在這種情況下,具有強引用的removeFromSuperView方法將減少仍然爲1的保留計數,因爲您的屬性保留了該對象。

如果你設置爲零的強引用,對象不再是子視圖,那麼它會被釋放,你將無法再使用自己的財產testButton。

如果您設置爲無強引用,但對象仍然是視圖層次結構中的子視圖,那麼它將保留在那裏,直到它的超視圖被銷燬,但是您將永遠無法再次操作該對象,因爲您的對象的引用消失了。

一般來說,如果在你的程序邏輯的屬性可以成爲它的範圍在零它的安全將其聲明爲?可選的,而不是爲!力解開可選的,因爲如果訪問的,而他們是零的力量展開會導致崩潰。

我希望我已經夠清楚了,我回答了你的疑惑。

編輯:

創建視圖編程;首先,沒有可供參考的出路是個好主意。如果一位新開發人員進入你的項目並看到一個插座,他希望在xib或故事板上找到相應插座;他不會期望看到通過代碼創建的這個插座。

無論如何我們在這裏一定要注意一些情況。但他們都在同一規則回落:

  • 弱不增加保留計數,強。
  • 保留計數== 0的對象立即解除分配。
  • 弱引用指向一個釋放的實例立即變爲零

爲了更好的理解:

weak var testButton: UIButton! 

func createButton() { 
    testButton = UIButton() 
    //Here testButton is already nil, because testButton is weak and 
    //the new UIButton is not retained. 
    view.addSubiew(testButton) //crash, because you are accessing 
    //a nil force unwrapped property 
} 

定義在這裏tesButton強修復該問題。

不同的是以下情況:

weak var testButton: UIButton! 

func createButton() { 
    let localTestButton = UIButton() //this is strong 
    testButton = localTestButton //this is weak 
    //here the new UIButton is retained by the localTestButton var 
    //so its retainCount is 1, so testButton is not nil as its 
    //reference is not deallocated 
    view.addSubview(testButton) //all good, this retains the UIButton 
    //that now has a retain count of 2 
    //At the end of the scope, all the local var are released, and 
    //their pointed objects decreases the retainCount. 
    //in this scope there is just the localTestButton that is released 
    //so the pointed object's retain count decreases from 2 to 1. 
    //if in another scope the subview is removed (testButton.removeFromSuperView()) 
    //then the UIButton retain count is 0 and it is deallocated. 
    //testButton will immediately become nil and no longer usable. 
} 
+0

@ARUN KUMAR我回答你編輯帖子。希望一切都清楚了。 –

-1

在ARC一個屬性默認爲強。 當控制器發佈時,每個UI元素都將被釋放,所以不用擔心釋放Storyboad UI元素或將它們設置爲零(可能會發生崩潰)。

4

你會得到一些不好的答案。

出口通常較弱,隱式解包的可選項。這就是類型指示後的!

奧特萊斯是爲了避免將視圖層次在內存中它不再需要後聲明爲弱。 (通常這個插座是它的superview所擁有的,只是將它從超級視圖中移除會導致它被釋放。通常這是正確的行爲。如果你想要一個插座從它的超級視圖中移除,你可以創建另一個強大的參考或使這個插座強大,但在這種情況下,當你完成它時,由你決定刪除它)

插座應該將聲明爲弱,只有極少數例外。是的,如果你宣佈它們強大,那麼當你完成它們時你應該將它們刪除。 (雖然如果你的視圖控制器被釋放,然後它並不重要,因爲它的強引用會自行消失。)

+0

什麼是正常變量的情況下,如'var tableData = NSArray()'。 –

+2

「爲了避免保留週期,聲明爲」弱點「。我認爲這不是原因:視圖不應該有強大的參考控制器層。我假設'IBOutlet'被創建爲弱視圖以使視圖卸載工作。鑑於卸貨已成爲過去,我總是讓它們變得「強壯」。 –

+0

我認爲沒有理由讓網點變得虛弱,因爲在99%的情況下,它們應該與其所有者完全同時存儲在記憶中。真正打擊我的是「弱」和隱式解包可選項的組合。如果你想讓某些東西變弱,這意味着它是可以刪除的,因此應該使用正常的選項。 – Sulthan

相關問題