转换Objective-C对象

Fre*_*eer 1 casting objective-c

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

wby*_*ung 6

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

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

例如:

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

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

你也可以做到:

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

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

  • +1.铸造只是一种合成糖.它与运行时无关. (2认同)