2010-07-13 64 views
3

用一種方法編寫一些Objective-C,我調用+alloc,然後-init來設置一個對象。如何在使用前確保對象已完成初始化?

object = [[MyClass alloc] init]; 
[object useFor:whatever]; 

接下來幾行代碼使用新創建的對象。如果前面提到的-init花費的時間太長,我肯定程序在開始使用新對象之前不會「等待」,是不是?如果沒有,是否有快速確保-init完成的方法?

我有時會看到誰寫沿

if(object = [[MyClass alloc] init]) { 
    [object useFor:whatever]; 
} 

線的東西程序員這是我應該去什麼?

回答

3

作爲一項規則,在C和Objective-C函數(和方法)語句順序執行,在你寫的順序。如果你在一個函數中先寫另一個函數,那麼第一個必須在下一個執行之前完成執行。

編譯器可能重新排序語句,如果它認爲,這樣做不會改變程序(它可以在不涉及併發的情況下預測得很好)的行爲,但是這是一種優化。 C標準將語句視爲順序語句,但只要實際程序的行爲與語句按其寫入順序執行時相同,編譯器就可以以任何方式實現它們。

這一切是說的很長的路要走:您init方法完成之前,調用方法可以繼續執行。

+0

謝謝,這非常有幫助。我認爲方法調用(或消息發送)的行爲不同,但現在我意識到情況並非如此。 – 2010-07-14 00:04:14

4

命令將按順序執行的,而不是paralell

(紈絝子弟,學習一些基礎知識;)

+1

嘿,謝謝。儘管公平,但在ObjC中的基礎文獻通常會「沒有代碼的話就把它看成是一個文本編輯器」,並且這個理論失敗了。 – 2010-07-14 00:02:19

9

當你調用init程序將不會繼續到下一行,直到init方法返回。到達第二行時,init方法已完成。它可能沒有成功完成,但它已經完成。

第二種形式是測試。首先,if聲明稱爲init方法。如果返回有效的對象,則測試爲真,然後執行下一條語句。這就是爲什麼你會看到init方法在成功時返回self,當有問題時會返回nil;以便可以運行這些測試以確保該對象在繼續之前已成功初始化。