2010-11-03 63 views
6

如果我們不想在我們的類中實現init方法,並且記住NSObject中的init只返回沒有初始化的對象的一個​​實例,如果我們已經獲得了實例,我沒有看到調用init的要點與分配。我已經嘗試過,但它確實有效,但我不確定它不會導致未來的問題。只有在沒有初始化的情況下才使用alloc才行嗎?

myClass *newObject = [myClass alloc]; 

代替:

myClass *newObject = [[myClass alloc] init]; 

非常感謝。

回答

16

不,只要撥打alloc就不正確。 alloc將對象的所有實例變量清零,然後有機會將全部或部分實例變量設置爲其默認值。有些類甚至使用它們的init方法來創建另一個實例,並返回該實例而不是您分配的實例。

許多班級希望他們的init方法被調用,並且如果您不撥打init可能會導致崩潰。如果您正在討論直接從NSObject繼承的自定義類,並且不需要初始化實例變量,那麼您可能會脫離[myClass alloc],但它肯定不是很好的編程風格。

+0

非常感謝您的解釋。 「如果你正在談論的是直接從NSObject繼承的自定義類,並且不需要初始化實例變量,那麼你可能會拋棄[myClass alloc],但它絕對不是好的編程風格。」那是我的情況。接受答案。 – toupper 2010-11-03 11:18:06

+2

@toupper:值得一提的是,如果你想有一個更短的語法,你可以做'[myClass的新];'這相當於'[[MyClass的頁頭] INIT]',但它很難被認爲是時尚。 – 2010-11-03 11:21:43

2

我認爲這不是一個好主意。
閱讀可可設計模式,特別是「兩個階段創造」

您還可以閱讀這篇文章http://www.informit.com/articles/article.aspx?p=1398610

+0

非常感謝,有用的信息。 – toupper 2010-11-03 11:19:56

+0

我不完全明白了吧「可可設計模式 - 兩級創造」造:它聲稱兩級創造更好,因爲它避免了「構造函數/類方法/工廠方法」爆炸,但相比去渣,不[[Foo alloc] init]與Foo相同f = new Foo(); f.init();? – 2015-09-09 23:58:56

0

我認爲,這將沒有多大關係,如果你沒有實現「 - (ID) init「,因爲如果你這樣做了,你會調用NSObject的init方法,它只是返回你發送給方法的相同值。儘管創建自己的init方法來設置實例變量是一個好主意。

相關問題