假設我有一個名爲Item的類。這是NewsItem和TwitterItem的超類。爲什麼在Objective C構造函數中使用[super init]?
如果我想創造一些NewsItem的做我必須使用(內部構造)
self = [super init];
如果是,爲什麼?在Java/C#中,我只想做,
NewsItem n = new NewsItem();
我不必在Java/C#中對超類做任何事情。只是無法把握它。
假設我有一個名爲Item的類。這是NewsItem和TwitterItem的超類。爲什麼在Objective C構造函數中使用[super init]?
如果我想創造一些NewsItem的做我必須使用(內部構造)
self = [super init];
如果是,爲什麼?在Java/C#中,我只想做,
NewsItem n = new NewsItem();
我不必在Java/C#中對超類做任何事情。只是無法把握它。
在Java和C#中,如果不明確調用它,編譯器會自動讓您的構造函數調用超類的構造函數。例如,the 「Java Tutorials」 say this:
如果構造函數沒有明確調用父類的構造函數,Java編譯器會自動插入到超類的無參構造函數的調用。如果超類沒有沒有參數的構造函數,那麼你會得到一個編譯時錯誤。對象確實有這樣的構造函數,所以如果Object是唯一的超類,那就沒有問題了。
在Objective-C中,編譯器不會自動執行它,所以你必須自己做。
這正是我想要的解釋。謝謝 – xrDDDD 2012-02-15 23:40:51
因爲你的超類(和你的超類的超類)也需要初始化的機會。
而且,請記住,您的超類將[很少]返回零或不同的實例。
這就是爲什麼你做的事:
- (id)init
{
self = [super init];
if (self) {
... init stuff ....
}
return self;
}
Kevin補充說返回類型。謝謝。由於(id)是默認值,因此不是必須的,但我也更喜歡它。 – bbum 2012-02-14 22:57:51
因爲您的自定義對象將至少從所有對象的母親那裏繼承:NSObject的,你必須調用「[超級初始化];」 'super'只是調用其超類的init方法
因爲您正在重寫init消息。如果你不覆蓋它,那麼[[NewsItem alloc] init]
只會調用超類的init消息。在C#中,你可以使用base來做同樣的事情。
可能的重複[爲什麼我應該調用self = \ [super init \]](http://stackoverflow.com/questions/2956943/why-should-i-call-self-super-init) – 2012-02-14 19:43:07