2010-01-01 64 views
7

當您在一個對象上多次調用-init時會發生什麼情況,是否存在一些隱藏的副作用? 你能否假設沒有額外的內存分配? 會有什麼違背這樣的想法?在Objective-C中多次調用-init

+0

不,你不能假定一個對象的初始值設定項沒有分配內存。你爲什麼想要擺在首位? – 2010-01-01 20:26:48

+1

我使用IB創建一個對象並將其與相應的控制器插座相連接。我觀察到這個對象被初始化了,所以假定+ alloc和-init必須被調用。所以問題出現了,如果我可以用不同的值再次初始化對象。 – CipherCom 2010-01-01 22:47:40

+2

如果你已經在Interface Builder中實例化了一個對象,你需要重寫'-initWithCoder:',因爲它會被調用而不是'-init',因爲對象被存檔在nib中,並且必須被解除存檔才能被應用程序使用。或者,只需實現'-awakeFromNib'並在那個地方改變你想要的任何設置。 – 2010-01-02 01:13:02

回答

31

調用-init多次未定義,不受支持,並且導致錯誤,崩潰和其他意外行爲。

很多類 - NSStringNSArray,並NSDictionary,例如 - 實際上沒有分配任何+alloc方法被調用。直到調用各種-init*方法之一,該對象纔有足夠的上下文來找出最有效的方法來做你所要求的任何事情。

3

我在Bill的答案中添加的一件事是,在編寫自己的-init方法時,需要防禦性編碼,並且不要認爲它們只會被調用一次。

+2

如何優雅地檢查對象沒有調用init方法? – jbat100 2011-10-18 22:40:16