2011-09-27 50 views
2

剛剛經歷了Objective C編程書籍。我注意到這個代碼
在Objective C中,每個用戶類都默認擴展NSObject嗎?

@interface Fraction: NSObject 
{ 
    int numerator; 
    int denominator; 
} 

-(void) print; 
-(void) setNumerator: (int) n; 
-(void) setDenominator: (int) d; 

@end 

作者在這本書中解釋每一件事情做偉大的工作,但關於這是否是一樣的只是

@interface Fraction 
    { 
     int numerator; 
     int denominator; 
    } 

    -(void) print; 
    -(void) setNumerator: (int) n; 
    -(void) setDenominator: (int) d; 

    @end 

原因,我問這個比較很簡單沒有提及問題在於,在JAVA中,默認情況下每個事物都會擴展Object,並且您不需要這麼說。當然,它們是兩種截然不同的語言,但這是我想到的一個很自然的問題。

回答

5

不,這兩個例子是不一樣的。 @interface Fraction創建了一個根本不與NSObject層次關聯的新根類。因此,它甚至不會響應+alloc;你將不得不實現你自己的分配方法。你幾乎從不想這樣做。

4

他們是不一樣的。在你的第二個例子中,你定義了一個不是從另一個類派生的類,因此它是一個根類(如NSObjectNSProxy)。你幾乎從不想自己創建一個根類(除非你是一個1337 h4x0r,並且非常清楚你在做什麼以及爲什麼)。

爲什麼你不希望創建自己的根類的原因是,你將不得不重新實現了很多的東西,NSObject給你,像respondsToSelector:performSelectorInBackground:withObject:甚至retainreleaseautorelease

+0

你的文章的重點是現貨,但你提到的方法是不好的參數,因爲它們實際上都在'NSObject' _protocol_中,這可以被一個新的根類所採用。 –

+0

當然你*可以*實現它們,但我的觀點是,這樣做將是不平凡的。 – DarkDust

+0

沒有比重新實施類的適當方法IMO更好或更差了,但足夠公平。 –

0

有必要顯式聲明包含NSObject的超類。每個類不一定是NSObject的子類,但不是NSObject的子類很少見。

1

創建2個類,擴展NSObject和OrphanObjects而沒有父類的ChildObject。

@interface ChildObject : NSObject 

@end 

@interface OrphanObject 

@end 

現在嘗試重寫 - (id)init;方法。

- (id)init 
{ 
    self = [super init]; 
    if (self) { 
     // Initialization code here. 
    } 

    return self; 
} 

對於ChildObject類,一切都會正常工作。對於OrphanObject類,編譯器不會讓你調用[super init],因爲沒有「超級」類。 這意味着,你必須實際告訴編譯器你想擴展NSObject。

相關問題