gpt4 book ai didi

iphone - 分配,可变到不可变数组?

转载 作者:搜寻专家 更新时间:2023-10-30 19:58:59 25 4
gpt4 key购买 nike

有人可以确认我理解正确吗?我对此的最初 react 是,当分配给 immutableArray 时,mutableArray 将变成 immutableArray,但事实并非如此。

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

NSMutableArray *mArray = [NSMutableArray arrayWithObjects:@"Teddy", @"Dog", nil];
NSArray *iArray = mArray;
[iArray addObject:@"Snoss"]; // Normally this would crash NSArray

非常感谢

加里。

最佳答案

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

在这种情况下,您确实实际创建了一个 NSMutableArray。

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

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

这实际上有效,因为它实际上一个 NSMutableArray,并且在运行时会响应那个选择器

这样做是不好的编码习惯,因为 NSArray 实际上并不响应 addObject 选择器。例如,我可以创建一个函数,例如:

-(void) addIt:(NSArray)myThing {
[myThing addObject:@"New String"];
}

编译器会给你一个警告说“NSArray”不响应“addObject”选择器。如果你转换一个 NSMutableArray,并将它传递给这个函数,它是 myThing,它实际工作。

但这是不好的做法,因为如果你真的传递了一个 NSArray,它就会崩溃。

总结:不要将对象真正的与您让编译器将其解释为的对象混淆。

关于iphone - 分配,可变到不可变数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4090646/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com