NSString *string = [NSNumber numberWithInt:2];
int var = [string intValue];
var 将是 2。那么,为什么?我明白,这是关于动态类型的,但引擎盖下是什么?
NSString *string = [NSNumber numberWithInt:2];
int var = [string intValue];
var 将是 2。那么,为什么?我明白,这是关于动态类型的,但引擎盖下是什么?
在这个代码示例中没有进行强制转换:[string intValue]
是一个常规的 Objective C 方法,NSNumber
用于检索存储在其中的整数值。您将对象分配给指针这一事实NSString
并没有改变任何东西:里面的对象仍然存在NSNumber
。您不会崩溃,因为 Objective C 是一种动态类型语言。它允许您分配错误类型的对象,但如果您尝试调用对象的方法,NSString
您string
将遇到崩溃:
NSString *string = [NSNumber numberWithInt:2];
int var = [string intValue]; // OK
BOOL isTwo = [string isEqualToString:@"2"]; // Crash
调用[string intValue]
实际上是一个消息表达式。这是有效的,因为string
它实际上指向一个NSNumber
对象并且它响应intValue
消息。如果您尝试发送特定于 NSString 类的消息,例如rangeOfString
您将收到“无法识别选择器”错误。
如果您在调试器中运行它并在其中放置一个断点,您将看到运行时知道该类型string
实际上是一个NSNumber
.
没有类型转换,它只是存储一个引用,NSNumber
然后再将其转换回来。你甚至不需要一个NSString
这将与id
id this = [NSNumber numberWithInt:22];
int val = [this intValue];
NSLog(@"%d",val);