首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将可变数组赋值给不可变数组?

将可变数组赋值给不可变数组?
EN

Stack Overflow用户
提问于 2010-11-04 03:03:09
回答 4查看 1.1K关注 0票数 4

有没有人能确认一下我的理解是正确的。我最初对此的反应是,当mutableArray分配给immutableArray时,它将成为immutableArray,但事实并非如此。

这是因为初始数组被分配为mutableArray,而immutableArray只是被分配指向相同的对象。编译器会给出一个警告,但代码在运行时执行得很好。

代码语言:javascript
复制
NSMutableArray *mArray = [NSMutableArray arrayWithObjects:@"Teddy", @"Dog", nil];
NSArray *iArray = mArray;
[iArray addObject:@"Snoss"]; // Normally this would crash NSArray

非常感谢

加里。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-11-04 03:20:31

不要混淆你刚刚创建的物理对象,以及你在代码中如何有效地转换它。

在本例中,您实际创建了一个NSMutableArray。

然后你可以有效地将其转换为NSArray -这是完全有效的-例如,在许多情况下,一个函数可能需要一个NSArray,而你可以向它传递一个NSArray,或者从它派生的任何东西(比如NSMutableArray)。

问题是你得到了一个编译器警告,因为你试图在一个对象上调用addObject,编译器认为它只是一个NSArray,因为这就是它的物理类型。

这实际上是可行的,因为它实际上是一个NSMutableArray,并且在运行时将响应该选择器

这样做是很糟糕的编码实践,因为NSArray实际上不会响应addObject选择器。例如,我可以创建一个函数,如下所示:

代码语言:javascript
复制
-(void) addIt:(NSArray)myThing {
  [myThing addObject:@"New String"];
}

编译器会给你一个警告,告诉你"NSArray“没有响应"addObject”选择器。如果你转换一个NSMutableArray,并把它传递给这个函数,它是myThing的,它实际上是可以工作的。

不过,这是一种糟糕的做法,因为如果您实际传递了一个NSArray,它就会崩溃。

摘要:不要混淆什么是对象,什么是你让编译器解释的对象。

票数 5
EN

Stack Overflow用户

发布于 2010-11-04 03:15:06

是的,你是对的。你应该这样做

代码语言:javascript
复制
NSArray *array = [NSArray arrayWithArray:mutableArray];

以确保没有人可以更改数组

票数 2
EN

Stack Overflow用户

发布于 2010-11-04 03:18:21

您的iArray实际上引用的是NSMutableArray实例,这就是它是NSMutableArray的原因。

Obj-c对类类型没有严格的检查,所有对象都是'id‘类型。你可以写

代码语言:javascript
复制
NSNumber *iArray = mArray

编译器将显示错误类型转换(而不是错误)的警告。但它会起作用的。

不要弄乱指针,因为在C++中没有对象类型转换。(有一些可重载的操作符用于将对象转换为另一个类)。

Obj-c与对象的工作方式非常类似于脚本/解释语言。动态类型(仅限对象)、反射、动态更改类实例的方法等-完全灵活。低级C/C++的速度和动态的灵活性的完美结合。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4090646

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档