簡體   English   中英

具有ios界面元素的強弱修飾符

[英]Strong and weak modifiers with ios interface elements

在我的項目中,我不使用Interface Builder,我注意到一件我不知道如何解釋的事情。 然而。 所以,到了這一點。 當我們在控制器中使用IB並定義用戶界面的元素(如UILabel或UIButton)時,我們使用這個丑陋的前綴IBOutlet和一個“弱”修飾符。 這就像音樂一樣。 但是當我們決定不使用IB並從代碼中定義整個用戶界面時,它就不起作用了。

假設我想將UILabel添加到控制器(使用IB)。 我會有這樣的東西我* .h文件:

@property (nonatomic, weak) IBOutlet UILabel * label;

而且我不需要在* .m文件中做更多的事情。 但是,如果我刪除* .xib文件並嘗試設置我的UILabel,例如,init方法之一,如下所示:

self.label = [[UILabel alloc] initWithFrame:CGRectMake(0,0,100,20)];
self.label.text = @"some text";
[self.view addSubview:self.label];

直到我將* .h文件更改為此內容才能生效:

@property (nonatomic, strong) UILabel * label;

現在,我知道弱和強之間的區別,但我不知道為什么我們在使用IB時可以使用弱的ui元素? 有些東西必須保持對這些元素的強烈指示,對吧? 但是什么? 在第二種情況下,它是控制器,但我不明白它在第一種情況下的行為。

Interface Builder為IBOutlet創建弱引用的原因如下:

IB知道其超級視圖保留了一個視圖。 因此,視圖樹中的任何對象都不需要除了根對象之外還有強引用。 視圖控制器在其主view屬性中保留此強引用。

現在當卸載視圖時(至少到iOS 5),UIViewController的view屬性設置為nil,釋放主視圖。 如果此超級視圖的子視圖的IBOutlets是強引用,則它們將視圖層次結構的一部分保留在內存中。 這是不需要的(並且在訪問這些孤立的視圖時可能會導致混淆)。

有些東西必須保持對這些元素的強烈指示,對吧? 但是什么?

正確,您必須至少有一個對象的強引用才能存在。 你只需要對UI的根級對象有一個強引用,這下面的任何東西都可能很弱(因為父對象將擁有它們的子級)。 與其文件所有者協調的.xib文件將為您完成此操作。

有關xib文件的工作原理,請參閱此文檔 具體來說,這個snippit:

您通常需要對頂級對象的強引用,以確保它們不會被釋放; 您不需要對圖表中較低的對象進行強引用,因為它們由父母擁有,您應該盡量減少創建強引用周期的風險。

從實際角度來看,在iOS和OS X中,出口應該被定義為聲明的屬性。 Outlets通常應該是弱的,除了那些從File的Owner到nib文件中的頂級對象(或者,在iOS中,故事板場景)應該很強。 因此,您創建的插座通常應該很弱

盡管已經接受了答案,但您可以在代碼中使用它

UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0,0,100,20)]; // strong ref
label.text = @"some text";
[self.view addSubview:label]; // strong ref from superview
self.label = label; // weak ref
// Now you can do `label = nil;`

這是從XIB加載時的要點。 label在分配給您的弱房產時已經具有超級視圖

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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