2011-11-24 62 views
2

我在我的代碼調試東西,認識到以下編譯申報與實際類型,目標C

NSMutableSet *s = [[NSMutableArray alloc] init]; 

Card *c = [[Card alloc] init]; 

[s addObject:c]; 
[s addObject:c]; 
[s addObject:c]; 

NSLog(@"Set now contains %d cards ", [s count]); //Prints 3 

但聲明的類型是這裏的設置..爲什麼允許重複?爲什麼這個編譯呢?

+1

你真的在你的第一行中將Set設置爲數組嗎?還是這是一個錯字? –

+0

當然這是一個錯字,但問題是,爲什麼這個編譯呢? –

+0

我也很好奇。所以我跑了一個快速測試。對於相同的代碼,我得到1作爲輸出。你是怎麼得到3的?確實set不會存儲重複值,但這並不一定意味着你不能添加重複值。這是一個邏輯「錯誤」的問題,因此編譯器不會抱怨。 –

回答

4

[[NSMutableArray alloc] init]返回類型id,這是Objective-C返回類型id的標準。在許多情況下,實際返回的類型取決於類實現,許多Apple提供的類都是類集羣並返回不同的類型。一個常見的例子是NSString,其中通常是返回類NSCFString的一個實例。

注意匹配類名是很重要的。

另見Marc Charbonneau here

+0

謝謝。非常有意義 –

2

[[NSMutableArray alloc] init]回報id作爲@CocoaFu提到的答案。您將其分配給您聲明爲NSMutableSet的指針,因爲返回的id而可以接受。像大多數其他語言一樣,僅僅因爲你宣稱它是一個NSMutableSet就不會讓它成爲一個。

由於NSMutableSetNSMutableArray都有一個名爲-addObject:的方法,所以沒有編譯器提出有關被調用的未知方法的警告。

除了您的指針,您聲明的代碼中沒有任何特定錯誤,因爲聲明不準確。