fuz*_*oat 4 iphone cocoa-touch objective-c
有人会这么好心以确认我正确理解了这一点。我对此的最初反应是 mutableArray 在分配给 immutableArray 时会变成 immutableArray,但事实并非如此。
这是因为初始数组被分配为一个 mutableArray 而 immutableArray 只是被分配为指向同一个对象。编译器发出警告,但代码在运行时执行得很好。
NSMutableArray *mArray = [NSMutableArray arrayWithObjects:@"Teddy", @"Dog", nil];
NSArray *iArray = mArray;
[iArray addObject:@"Snoss"]; // Normally this would crash NSArray
Run Code Online (Sandbox Code Playgroud)
非常感激
加里。
不要将您刚刚创建的物理对象与您在代码中有效地投射它的方式混淆。
在本例中,您确实创建了一个 NSMutableArray。
然后你有效地将它转换为一个 NSArray - 这是完全有效的 - 例如,在很多情况下,一个函数可能需要一个 NSArray,你可以将它传递给一个 NSArray,或者从它派生的任何东西(如 NSMutableArray)。
问题是您收到编译器警告,因为您试图在编译器认为只是 NSArray的对象上调用 addObject ,因为这就是它的物理类型。
这实际上会起作用,因为它实际上是一个 NSMutableArray,并且在运行时会响应该选择器。
这样做是一种糟糕的编码习惯,因为 NSArray 实际上并不响应 addObject 选择器。例如,我可以创建一个函数,例如:
-(void) addIt:(NSArray)myThing {
[myThing addObject:@"New String"];
}
Run Code Online (Sandbox Code Playgroud)
编译器会给你一个警告,说“NSArray”不响应“addObject”选择器。如果你施放一个NSMutableArray,它传递给这个函数,它myThing,它会实际工作。
但是,这是不好的做法,因为如果您实际上传递了 NSArray,它会崩溃。
简介:不要混淆对象的真正含义与您让编译器将其解释为.