2012-04-25 60 views
6

剛剛開始與ARC。在ARC之前,我只是簡單地聲明我的店鋪,例如:IBOutlet UIButton *button;,所以我不保留它或任何東西。使用ARC,不指定弱或強意味着強。IBOutlet是否暗示__weak?

所以如果我在ARC下做同樣的事情(即IBOutlet UIButton *button;),這是否意味着按鈕是一個強有力的參考?或者我必須將其明確定義爲弱?

總之,確實IBOutlet中暗示__weak?

回答

16

IBOutlet實際上是定義爲虛無

#define IBOutlet 

Xcode的只是使用這個詞的存在您的代碼用於允許您在Interface Builder中進行連接。一個變量聲明或屬性作爲IBOutlet

IBOutlet UIButton * button; 
@property (...) IBOutlet UIButton * button; 

因此不具有任何直接影響,只要ARC而言;它不(雖然,可以想象,它可以)翻譯成__weak或類似的東西。在編譯器獲取它時,這個詞本身完全從你的源代碼中消失。

在另一方面,事實證明這個變量或屬性是出口確實對如何需要考慮內存管理的一個有意義的作用。

ARC下的對象變量聲明(如IBOutlet UIButton * button;)的隱式存儲限定符爲__strong,正如您所說的 - 分配給該變量的任何對象都將被視爲「擁有」。根據MRR,聲明只是一個指針;賦值對賦值對象的引用計數/所有權沒有影響 - 它的作用方式與assign屬性相同。*因此,兩個管理系統之間相同伊娃聲明的含義會有所不同。

xib中的對象擁有由視圖層次結構形成的所有者/所有者關係;也就是說,父視圖擁有他們的子視圖。 xib中的頂層視圖由稱爲文件所有者的對象擁有。這種設置意味着,一般來說,您在xib中的對象的銷售點是而不是頂級應該是weak(在ARC下)或assign(如果屬於MRR下的屬性)。他們不是擁有關係;它們本質上是查看列表中方便的索引。這是Apple's recommendation

...你不需要對象下強引用倒在圖中,因爲它們是由他們的父母所擁有的,你應該最大限度地避免形成很強的參考週期的風險。

出口通常應該是weak,除了那些從文件所有者到nib文件中的頂層對象(或者在iOS中,故事板場景),應該是strong。您創建應該會[原文]因此通常是weak默認店......

你簡單的指針IBOutlet S,正如我所解釋的,擔任 - 內存管理的目的 - 像weak性質,其中**意味着他們正在做正確的事情。在ARC下編譯時,相同的聲明變成可能是錯誤的東西

總結:IBOutlet轉化爲weak,但它確實改變指針的含義。由於IBOutlet UIButton * button;的默認內存管理語義從MRR下的「分配」變爲ARC下的「所有」,並且因爲IBOutlet一般應該是非擁有的,所以存在IBOutlet確實意味着該指針應該被聲明爲__weak弧。


*而類似weak屬性 - 唯一的區別還有就是weak指針設置爲nil當對象被釋放。

**除自動-nil部分。或者,應該是weak屬性。

+0

謝謝,現在更清楚了。但是有一件事我很困惑:即使我沒有明確地將IBOutlet定義爲__weak(在這種情況下它會很強大),ARC是不是會照顧它呢?只要沒有保留週期(並且沒有保留週期),一切都照顧好了,不是嗎? – 0xSina 2012-05-04 12:42:12

+0

ARC會繼續做它的工作,所以,只要你避免保留週期,一個強大的IBOutlet也可以工作。 – 2012-05-04 17:31:10

3

的IBOutlet中關鍵字僅用於該對象與在界面生成器的元件相關聯。它與弱或強或ARC或內存管理無關。

+0

這很荒唐; 「IBOutlets」的內存管理需要像任何其他變量的管理一樣考慮。 – 2012-04-25 03:17:15

+2

@JacquesCousteau不是真的,仔細閱讀他的答案,IBOutlet KEYWORD與天氣無關,財產將被設置爲強或弱。他所說的是100%準確的。無論您如何決定管理該對象內存。 – Pochi 2012-04-25 03:23:26

+0

IBOutlet的財產需要像管理任何其他財產一樣進行管理,但IBOutlet不會考慮它。 – bbarnhart 2012-04-25 03:25:46

4

不,IBOutlet基本上是在代碼編譯時被剝離的。但它是XCode的助手,因此它可以知道什麼是InterfaceBuilderOutlet。

基本上這個詞可以讓你連接Interface Builder中的元素。

默認情況下它仍然很強(假設這個詞不存在)。

但是,建議您將其設置爲弱,因爲一旦某個東西連接到接口構建器,那麼THAT接口將保持對它的強引用,所以沒有必要具有雙重強引用,特別是如果該元素並不意味着在界面卸載時保持活動狀態。

閱讀本題,這正是你正在尋找:

Should IBOutlets be strong or weak under ARC?

+1

我是否必須將我的IBOutlet聲明爲屬性? – 0xSina 2012-04-25 03:21:57

+0

不,你可以直接聲明它們作爲實例變量,如果你在MacOS上執行它們,它們會有所不同,你可以在這裏閱讀更多關於它的信息:http://stackoverflow.com/questions/1221516/does-an-iboutlet - 需要一個財產合成 – Pochi 2012-04-25 03:27:11

+1

好吧,如果我確實聲明他們爲實例變量,最好是這樣的:__weak IBOutlet UIButton *按鈕,對不對? – 0xSina 2012-04-25 03:30:38