10

我的問題是爲什麼弱IBOutletCollection始終爲零?如果我的所有按鈕都變得很弱,那就太奇怪了。我試圖理解蘋果的邏輯,我可以看到在內存管理方面,單個按鈕和一組按鈕沒有區別。我錯過了什麼嗎?弱IBOutleCollection始終爲零

+0

感謝您將問題描述爲「弱」問題。立即解決我的問題! – phatmann 2013-04-25 22:36:43

回答

9

並不完整,但簡單的答案:

與IB創造了單UIButton自動爲一些其他的UIView的子視圖(至少你UIViewController的.view),強烈指出,正因爲如此。

IBOutletCollectionNSArrayNSMutableArray,沒有在任何地方顯示UIView和UIViews顯然沒有屬性指向出口(系列)■這一點給他們,所以沒什麼指向IBOutletcollections。你必須自己做。

7

從蘋果公司的Resource Programming Guide

每次你問的是一個NSBundle或NSNib類加載nib文件的時候,底層代碼創建該文件中的對象的新副本,並將它們返回到您。 (nib加載代碼不會從以前的加載嘗試中回收nib文件對象。)您需要確保您只需要維護新的對象圖,並在完成時將它拒絕。您通常需要對頂級對象的強引用以確保它們不會被釋放;您不需要強烈參考圖表中較低的對象,因爲它們是由其父母擁有的,您應該儘量減少創建強參考週期的風險。

從實用的角度來看,在IOS和OS X網點應定義爲聲明的屬性。除了從文件所有者到應用程序強大的nib文件中的頂級對象(或者在iOS中,故事板場景),出口通常應該很弱。因此,您創建的插座通常應該較弱,因爲:

例如,您爲視圖控制器視圖或窗口控制器窗口的子視圖創建的插座是不暗示所有權的對象之間的任意引用。 強大的插座通常由框架類指定(例如,UIViewController的視圖插座或NSWindowController的窗口插座)。

@property (weak) IBOutlet MyView *viewContainerSubview; 
@property (strong) IBOutlet MyOtherClass *topLevelObject; 

進一步壓低頁:

奧特萊斯應該變強,當出口應該考慮到自己被引用的對象:

  • 如前所述,這通常情況下,文件的所有者 - 一個nib文件中的頂級對象通常被認爲是由文件的所有者擁有。
  • 您可能在某些情況下需要來自nib文件的對象存在於其原始容器之外。例如,您可能有一個視圖的出口,可以暫時從其初始視圖層次結構中刪除,因此必須單獨維護。