[英]Why some Outlets are made strong references even tough the documentation specifies that outlets should be weak reference
嗨,我是iOS編程的新手。 我知道強弱的參考是什么 。 但是當我不得不處理插座時,我會混淆使用哪種類型的參考。 經過文件說明
Outlets通常應該是弱的,除了那些從File的Owner到nib文件中的頂級對象(或者,在iOS中,故事板場景)應該很強。
所以我在完成上述陳述后理解的是,我們創建的奧特萊斯默認情況下通常應該很弱 。
但是在學習一些教程時,我遇到了一些代碼,人們已經宣布了一個強大的參考 。 例如,請考慮以下代碼:
@interface AboutViewController : UIViewController
@property (nonatomic, strong) IBOutlet UIWebView *webView;
@end
代碼 :
@property (nonatomic, strong) IBOutlet UIWebView *webView;
說我們的AboutViewController有一個UIWebView對象 。
但是為什么我們需要一個強大的UIView對象參考 ? 正如文件所述,這不應該是一個弱的參考?
另外,請在上面引用的文檔聲明中解釋文件所有者對頂級對象的含義是什么?
我在這個網站上經歷了很多類似的問題,但沒有一個能幫我清除疑慮。 所以請幫忙。 提前致謝 :)
非頂級GUI元素的用途 - 強或弱 - 取決於您如何使用他們的網點。 如果你有一個弱參考
@property (nonatomic, weak) IBOutlet UIWebView *webView;
然后調用方法
[webView removeFromSupeview];
你的webView將是零,只是通過添加來恢復UIWebView是不可能的
[self.view addSubview:webView];
如果這適合您 - 最好使用weak,因為當您不需要時,您將釋放webView的內存。
另一方面,如果有strong
參考后
[webView removeFromSupeview];
webView仍將具有referenceCount> 0,並且僅當所有者將顯式釋放它時才會取消分配webView
self.webView = nil;
或者在主人的
- (void)dealloc
與業主本人一起。
通常,如果您有靜態GUI,則沒有區別。 如果要刪除(不隱藏)某些視圖,可以在以后添加它們 - 應該使用強引用。
頂級對象應保持強大。 喜歡
@property(nonatomic,retain) UIView *view;
在UIViewController中。
在這樣的出口的情況下,使用強引用代替弱引用通常沒有壞處。 在某些情況下,您需要一個強大的參考。
這個想法是,某些東西必須始終保持對物體的強烈參考,否則它可能會消失。 如果對象是另一個視圖的子視圖的視圖,那么該超級視圖將保留對它的強引用,因此您可以使用弱引用。 但是,如果您要對該視圖執行其他操作,例如出於某種原因將其從超級視圖中刪除(可能在其他地方重復使用,或者某些事情),那么您將需要使用強大的屬性,以便始終持有它的東西。
關於文件所有者問題,那是因為頂級對象(很可能是一個視圖)沒有超級視圖保留它,所以你需要使用一個強大的屬性,這樣你才能堅持下去。
簡單的答案是,除非你支持iOS 5,否則網點應該總是很強大。
弱插座的目的是在iOS5中,如果系統卸載視圖控制器的視圖以節省內存,則任何指向子視圖的插座都將自動釋放。
在iOS 6及更高版本中,系統永遠不會卸載視圖控制器的視圖(從不調用viewDidUnload),因為Apple找到了一種方法來釋放視圖使用的大部分內存而不釋放視圖本身。
因此,在視圖控制器本身被釋放之前,視圖控制器中的插座通常不需要被釋放,此時ARC將清理所有插座。
因此,只需對所有商店使用strong,您就不必擔心由於使用錯誤的引用類型而導致的模糊錯誤或編譯器警告。
引用Apple的資源編程指南 ,
每次請求NSBundle或NSNib類加載nib文件時,底層代碼都會在該文件中創建對象的新副本並將它們返回給您。 您需要確保在必要時維護新的對象圖,並在完成后將其取消。 您通常需要對頂級對象的強引用,以確保它們不會被釋放; 您不需要對圖表中較低的對象進行強引用,因為它們由父母擁有,您應該盡量減少創建強引用周期的風險。
對於像UIViewController
這樣的框架類,NIB文件的頂級對象是view
屬性。 如果您簽入文檔,則將其聲明為retain
(類似於strong
)。
@property(nonatomic, retain) UIView *view
因此,此容器view
任何子視圖都應由它自動擁有。 如果您現在將這些子視圖出口聲明為strong
那么當框架嘗試清理容器view
時,它們將創建一個strong
循環並導致內存泄漏。 為避免這些強循環,應將所有子視圖(或非頂級對象)聲明為weak
屬性。
什么時候能宣布IBOutlet
strong
當插座應被視為擁有引用對象時,應將插座更改為強:
- 如前所述,通常情況下,文件的所有者 - nib文件中的頂級對象通常被視為歸文件所有者所有。
- 在某些情況下,您可能需要來自nib文件的對象存在於其原始容器之外。 例如,您可能有一個可以暫時從其初始視圖層次結構中刪除的視圖的插座,因此必須單獨維護。
如果webView
對象符合上述case2的條件,則需要檢入代碼。 如果不是教程已經錯了,它實際上應該是weak
。
希望有所幫助!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.