2010-01-21 11 views
1

如果您的IBarut上有IBOutlet,如接口生成器設置程序?請打我!

IBOutlet UIView * view;

@property(nonatomic,retain)UIView * view;

該對象通過IB將創建由IB管理,

,但如果你有,

的UIView *視圖。

@property(nonatomic,retain)IBOutlet UIView * view;

ib現在使用你的setter來設置該對象嗎?那意味着setter添加了+1並且需要設置爲零或者對象會泄漏?

+4

Ka-pow!在接吻。 –

+0

@jeffamaphone:從我+1 ...但嘿,這是一個非暴力的論壇...;) – t0mm13b

回答

2

閱讀here,Aaron Hillegass發表了一些關於這方面的文章。

在桌面上,當加載一個榫文件,網點設置在一個合理的方式:設置名爲foo的出口,筆尖加載程序查找一個名爲setFoo訪問器:。如果無法找到訪問器,則nib加載器會直接設置變量foo。這聽起來像鍵值編碼,對吧?事實並非如此。重要的區別是,筆尖加載將foo當作弱參考;它指向的對象不被保留。因此,如果您創建了NSViewController的子類,該子類有十幾個子插座,則只保留頂級視圖。所以,當視圖控制器被釋放時,它釋放頂層視圖,所有的子視圖都會自動釋放。整潔!

然而,在手機上,nib加載器使用鍵值編碼來設置插座;默認情況下,網點被視爲強引用。如果您的插座沒有插件,則它所指的視圖將保留。

+0

我有點認爲,但如果它的任何不同,它仍然不會回答,如果它放在伊娃或@property本身。它似乎沒有什麼區別。 – drunknbass

+0

實際的'IBOutlet'被定義爲一個空的宏,並且只被InterfaceBuilder用來查找插座。嘗試在Xcode和Ctrl鍵並單擊''IBOutlet'跳轉到Definition' – epatel

+0

的必然結果是,雖然筆尖裝載機將不會保留對象你,如果你申報財產的保留,那麼當筆尖加載器調用合成的setter,setter *將*保留該對象。 –

0

這兩種情況下,您必須釋放插座。如果你有一個物業,IB會使用它,讓你管理保留或不(如果你使用assign)。如果您沒有物業,IB將分配該值,但會自動保留該值,然後您需要將其釋放。

如果將屬性標記爲IBOutlet,則不需要將類變量標記爲IBOutlet。

+0

OK,最後是有道理的讀取後門柱..所以基本上只要你連接的出口(那不是明確指定)該類現在把一個+1的對象.. 我原來的,我想幼稚的想法是,如果我在ib中創建一個對象,其內存管理是自動的。並在控制器發佈後爲我發佈。但似乎只能這樣了,如果你使用IB對象,從不將它們連接到任何東西,只要你連接到插座你(對象)現在負責。 – drunknbass

+0

我覺得你有責任,你實際上是在使用任何情況下......所以,如果你給一個視圖的引用,你應該釋放視圖,因爲它在itwas發送給你,但是當涉及不釋放被自動保留背部?也許你應該保留,當你得到它... –

+0

@drunkbass:你基本上是正確的,雖然法寶之一位是照顧你的 - 使用視圖控制器時,認爲是有線的視圖控制器「的看法? 「財產,並由視圖控制器爲您照顧。 @布賴恩:如果你有一個IBOutlet,你有,除非你使用指派屬性將其釋放。這很有效,因爲通常您使用的IBOutlets已經是視圖的子視圖,這意味着包含視圖正在保留視圖,因此出口將保留直到視圖消失。如果他們不在視圖中,我認爲分配屬性不起作用。 –

4

IBOutlet在結果代碼中不執行任何操作 - 它由預處理器完全刪除。它只是在那裏,所以Interface Builder可以掃描你的頭部,看看它應該把它看作是出口的東西。

0

AFAIK,如果您將IBOutlet放在伊娃或財產上並不重要。總之,IBOutlet屬性應該是(非原子的,分配的),而不是保留的,因爲NIB加載器可以處理所有這些。

+0

對不起肖恩這其實是錯誤的。他們應該保留在ios上,並且它的偏好,但也不是100%將他們(IBOutlet)放在法伊爾或財產上。 – drunknbass