2011-09-11 12 views
0

的情況下,我在Objective-C編程初學者,因爲我是通過一個例子來工作,我發現了一些好奇的多態性的Objective-C:多態性的NSMutableArray

// I know the message should have been mutableCopy, but this is how I came to find 
// this ... anomaly 
NSMutableArray *arrayCopy = [self.array copy]; 
[arrayCopy replaceObjectAtIndex:0 withObject:[NSNumber numberWithInt:2]]; 

此代碼編譯,但是它會使應用程序崩潰,並顯示一條消息,指出arrayCopy無法識別消息replaceObjectAtIndex:withObject :.

我的問題是,爲什麼會這樣編譯擺在首位(和它不產生上分析警告/問題)?鑑於NSMutableArray的從NSArray的繼承,arrayCopy到一個返回的NSArray分配如何能有效嗎?

在此先感謝。

+0

那是的OBJ-C的美女,可以在運行時改變行爲。但是,這必須警告你,關於運行時警告和黃色泡沫。 – doNotCheckMyBlog

+0

「在運行時改變行爲」是什麼意思?這不是多態性提供的嗎?在這種情況下,所有OO語言以及Objective-C都將具有此功能。 –

回答

3

用於複製的方法,簽名是

- (id)copy 

這意味着它返回一個指向一個Objective-C的對象,但否則不提供任何類型的信息提供給編譯器。

這意味着,編譯器不會發出警告有關的類型是錯誤的。

+0

我看......我還是覺得有點直覺,即轉讓在運行時不返回任何類型的錯誤。它有效地說:arrayCopy是一個NSMutableArray,但它不是一個真正的NSMutableArray ... –