2012-09-22 27 views
4

我們可以依賴Objective-C中的規則,一個類的指定初始化器總是被調用嗎?或者我們可以說,幾乎總是如此,除了幾個例外?例如,對於UIViewdocs說:在Objective-C中,指定初始化程序總是被調用的規則並不總是被遵守?

initWithFrame:方法

如果以編程方式創建一個視圖對象,這種方法是UIView類的 指定初始化。子類可以重寫 此方法來執行任何自定義初始化,但必須在其實施開始時調用超級 。

如果您使用Interface Builder 來設計您的接口,則當您從後續從nib文件加載視圖 對象時,將不調用此方法。在筆尖 文件對象被重組,然後用自己的的initWithCoder初始化: 方法

或者我們可以說,如果是程序,規則應該始終適用於精心設計的課程,但Interface Builder中有點不同,因爲它可以從非程序化的方式「復活」或構建對象。如果是這樣,當我們進行iOS編程時,他們是否還有其他例外情況?

回答

4

事實上,使用Interface Builder設計的類未被存檔並且未被初始化。

被存檔涉及該類未初始化但未存檔,所以initWithCoder:方法負責使用Interface Builder配置的存檔屬性加載控件時設置控件。

你應該把你的初始化操作放在awakeFromNib:方法中,在每次加載對象後調用它,這樣你就可以確定你的初始化語句會被調用。

+0

'awakeFromNib:'在以編程方式創建對象時不會被調用。我建議在'layoutSubviews'中進行初始設置(對於'UIView'子類) – Sven

相關問題