2011-09-11 11 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 ... –