转换Objective-C对象

时间:2012-03-30 18:15:40

标签: objective-c casting

我一直在想这个问题,谷歌没有向我提供我想要的信息。铸造过程有多快?它取决于对象具有的字段数量吗?这是不是要不惜一切代价避免的事情?它在x32,x64和ARM机器上有所不同吗?

1 个答案:

答案 0 :(得分:6)

Casting仅供编译器向您发出更好的警告。在运行时,转换没有性能损失。所有对象都只是对象。您将消息发送到这些对象。

当您在代码中指向该对象时,运行时不关心您给出的类型。它会发送消息,无论如何。

例如:

NSArray *myString = [NSString stringWithFormat:@"Hello"];
NSNumber *longerString = [(NSString *)myString stringByAppendingString:@" World"];
NSLog(@"%@", longerString);

将记录Hello World。您确实为事物提供类型,以便编译器可以检查,但运行时只知道您将消息传递给对象。它将使用对象的类来查找从消息名称调用的方法,但它不关心您在编译时键入的内容。

你也可以做到:

id myString = [NSString stringWithFormat:@"Hello"];
id longerString = [myString stringByAppendingString:@" World"];
NSLog(@"%@", longerString);

并且运行时将执行完全相同的操作,但编译器将以不同的方式匹配您的类型并根据不同的语义生成警告/错误(基本上,任何对象都表示它会响应此消息)。