2
 NSString *string = [NSNumber numberWithInt:2];
 int var = [string intValue];

var 将是 2。那么,为什么?我明白,这是关于动态类型的,但引擎盖下是什么?

4

3 回答 3

2

在这个代码示例中没有进行强制转换:[string intValue]是一个常规的 Objective C 方法,NSNumber用于检索存储在其中的整数值。您将对象分配给指针这一事实NSString并没有改变任何东西:里面的对象仍然存在NSNumber。您不会崩溃,因为 Objective C 是一种动态类型语言。它允许您分配错误类型的对象,但如果您尝试调用对象的方法,NSStringstring将遇到崩溃:

NSString *string = [NSNumber numberWithInt:2];
int var = [string intValue];                // OK
BOOL isTwo = [string isEqualToString:@"2"]; // Crash
于 2013-05-14T18:25:47.413 回答
2

调用[string intValue]实际上是一个消息表达式。这是有效的,因为string它实际上指向一个NSNumber对象并且它响应intValue消息。如果您尝试发送特定于 NSString 类的消息,例如rangeOfString您将收到“无法识别选择器”错误。

如果您在调试器中运行它并在其中放置一个断点,您将看到运行时知道该类型string实际上是一个NSNumber.

于 2013-05-14T18:29:09.633 回答
1

没有类型转换,它只是存储一个引用,NSNumber然后再将其转换回来。你甚至不需要一个NSString这将与id

id this = [NSNumber numberWithInt:22];
    int val = [this intValue];
    NSLog(@"%d",val);
于 2013-05-14T18:33:34.737 回答