2012-11-29 36 views
1

請考慮在故事板文件中有一個對象鏈接到IBOutlet(如下所示)的情況。Alloc-init UIStoryboard中的對象

@property (nonatomic, strong) IBOutlet UIImageView *imageView; 

左到它自己的設備中,ViewController將愉快地加載並顯示正確的圖像正確的幀等的內部,如在界面生成器確定的。 但是,如果將以下代碼添加到視圖控制器的方法viewDidLoad方法中,則會獲得(顯然)相同的結果。

- (void)viewDidLoad { 
    _imageView = [[UIImageView alloc] init]; 
    //... 
} 

這是否意味着IBOutlets的編程式alloc-initing是完全可選的?或者是增加這條線實現稍微不同的結果?

我在問,因爲我總是在實現中添加alloc-init,然後在我最近的項目中我忘了它,但令我驚訝的是,它仍然完全按照預期工作。

+0

如果我是正確的,你不需要分配init。當你從筆尖加載時,它通常會爲你做。 – iDev

回答

6

故事板或xib文件是包含在其中的對象的序列化。當故事板被加載時,所有的對象都被實例化(使用initWithCoder:,因爲我們正在對它們進行反序列化)。這和allo/init的功能相同,只是增加了設置xib中定義的對象的所有屬性。

xib包含有關您的圖像視圖的足夠信息以完全創建它。如果你然後分配/初始化一個新的圖像視圖並將其分配給用於插座的變量,那麼您只需更換從故事板創建的對象,這是非常沒有意義的,因爲您的插座現在指向任何屏幕。

總結 - alloc/init的每個插座不是可選,它的是錯誤

1

如果您使用Xcode 4.4,它會自動爲您合成屬性。這可能是你正在經歷的? Ref

2

將對象添加到NIB時,對象的生命週期由UIViewController(或子類)和ARC引用完全控制,默認情況下它很弱,因爲ViewController將處理對象的alloc,init和release正確地加載視圖時,你在那裏做了什麼,它將ARC引用改爲強壯的,所以在你引用它後,對象不會立即被釋放,它會在你嘗試的時候工作,但理論上你會以創建的對象結束在界面生成器中以及在那裏創建的那個,如果你沒有設置任何框架或添加到任何視圖,並且你沒有在對象後面引用任何引用,ARC會釋放它,並且你將以圖像結束查看您在Inteface Builder中創建的視圖,但在您將_imageView引用到剛剛創建的新[[UIImageView alloc] init]時沒有任何指針。

0

故事板中的對象的Alloc/init基本上是一個錯誤。

加載視圖時,所有子視圖都將被初始化並自動加載。如果您再次初始化它,則會創建另一個實例並且該對象的前一個實例未使用。

事實上,爲了使最近初始化的對象實例正常工作,您必須將實例(在您的UIImageView實例中)添加爲子視圖。