2012-07-21 89 views
0

所以我對這個網站很陌生,並不確定約定如何去問一個問題,但我只是從Objective-C開始,並且有一個與對象實例化相關的問題。目的C分配方法的邏輯?

好的,所以我知道根類NSObject有類方法alloc和init,並且這些方法傳遞給任何繼承NSObject的類,這幾乎是每個類。我知道實例化對象的典型格式是這樣的:

MyObject *m = [[MyObject alloc]init];

但考慮MyObject來有自NSObject的繼承了alloc和初始化方法,這個理論上也可正常工作,考慮到爲MyObject和NSObject的具有相同的頁頭和init方法(假設類不重寫它們):

MyObject *m = [[NSObject alloc] init];

而且它適用於只是實例,但是當我嘗試打電話給在爲MyObject類中的任何方法,一個NSException被拋出。當我將NSObject alloc切換回MyObject alloc時,它可以工作。我只是不明白爲什麼!這可能是一個基本問題,但有任何解釋?

在此先感謝!

傑克

+0

什麼是拋出的異常? – 2012-07-21 17:57:05

+0

@NSArray我相信這是一個NSInvalidArgumentException - 無法識別的選擇器發送到實例(實例的十六進制地址) – 2012-07-21 18:04:46

回答

2
[[NSObject alloc] init] 

創建一個NSObject的,如果你把它分配給另一個類型的變量,因此它並沒有太大的意義做MyObject *m = [[NSObject alloc] init];,同時它還可以是有意義的像做MyClass *obj = [[MySubClass alloc ] init];不管,因爲MySubClass也是一個MyClass。

3

邏輯是一樣的,但傳遞給消息alloc的實現的類對象不是。在第一種情況下,編譯器將你的代碼轉換成:

objc_msgSend([MyObject class], @selector(alloc)]; 

,從而ALLOC實施創建類MyObject的一個實例。但是,如果你寫[NSObject alloc];它轉化爲

objc_msgSend([NSObject class], @selector(alloc)]; 

所以一個普通的NSObject的實例被創建,這顯然不會給你的類的消息作出響應。