NSString *string = [NSNumber numberWithInt:2];
int var = [string intValue];
var将是2。 所以为什么?我理解,这是关于动态打字的问题,但是什么是幕后的?
答案 0 :(得分:2)
此代码示例中没有进行强制转换:[string intValue]
是NSNumber
提供的常规Objective C方法,用于检索作为整数存储在内部的值。您将对象分配给NSString
指针的事实不会改变任何内容:内部对象仍为NSNumber
。您没有遇到崩溃,因为Objective C是一种动态类型语言。它允许您分配错误类型的对象,但如果您尝试在NSString
对象上调用string
方法,则会发生崩溃:
NSString *string = [NSNumber numberWithInt:2];
int var = [string intValue]; // OK
BOOL isTwo = [string isEqualToString:@"2"]; // Crash
答案 1 :(得分:2)
对[string intValue]
的调用实际上是message expression。这是有效的,因为string
实际上指向NSNumber
对象并且它响应intValue
消息。如果您尝试发送特定于NSString类的消息,如rangeOfString
,则会出现“无法识别选择器”错误。
如果在调试器中运行此命令并在其中放置断点,您将看到运行时知道string
的类型实际上是NSNumber
。
答案 2 :(得分:1)
没有类型转换只是存储NSNumber
的引用,然后再将其转换回来。你甚至不需要NSString
这将适用于id
id this = [NSNumber numberWithInt:22];
int val = [this intValue];
NSLog(@"%d",val);