有没有人能确认一下我的理解是正确的。我最初对此的反应是,当mutableArray分配给immutableArray时,它将成为immutableArray,但事实并非如此。
这是因为初始数组被分配为mutableArray,而immutableArray只是被分配指向相同的对象。编译器会给出一个警告,但代码在运行时执行得很好。
NSMutableArray *mArray = [NSMutableArray arrayWithObjects:@"Teddy", @"Dog", nil];
NSArray *iArray = mArray;
[iArray addObject:@"Snoss"]; // Normally this would crash NSArray非常感谢
加里。
发布于 2010-11-04 03:20:31
不要混淆你刚刚创建的物理对象,以及你在代码中如何有效地转换它。
在本例中,您实际创建了一个NSMutableArray。
然后你可以有效地将其转换为NSArray -这是完全有效的-例如,在许多情况下,一个函数可能需要一个NSArray,而你可以向它传递一个NSArray,或者从它派生的任何东西(比如NSMutableArray)。
问题是你得到了一个编译器警告,因为你试图在一个对象上调用addObject,编译器认为它只是一个NSArray,因为这就是它的物理类型。
这实际上是可行的,因为它实际上是一个NSMutableArray,并且在运行时将响应该选择器。
这样做是很糟糕的编码实践,因为NSArray实际上不会响应addObject选择器。例如,我可以创建一个函数,如下所示:
-(void) addIt:(NSArray)myThing {
[myThing addObject:@"New String"];
}编译器会给你一个警告,告诉你"NSArray“没有响应"addObject”选择器。如果你转换一个NSMutableArray,并把它传递给这个函数,它是myThing的,它实际上是可以工作的。
不过,这是一种糟糕的做法,因为如果您实际传递了一个NSArray,它就会崩溃。
摘要:不要混淆什么是对象,什么是你让编译器解释的对象。
发布于 2010-11-04 03:15:06
是的,你是对的。你应该这样做
NSArray *array = [NSArray arrayWithArray:mutableArray];以确保没有人可以更改数组
发布于 2010-11-04 03:18:21
您的iArray实际上引用的是NSMutableArray实例,这就是它是NSMutableArray的原因。
Obj-c对类类型没有严格的检查,所有对象都是'id‘类型。你可以写
NSNumber *iArray = mArray编译器将显示错误类型转换(而不是错误)的警告。但它会起作用的。
不要弄乱指针,因为在C++中没有对象类型转换。(有一些可重载的操作符用于将对象转换为另一个类)。
Obj-c与对象的工作方式非常类似于脚本/解释语言。动态类型(仅限对象)、反射、动态更改类实例的方法等-完全灵活。低级C/C++的速度和动态的灵活性的完美结合。
https://stackoverflow.com/questions/4090646
复制相似问题