将NSNumber分配给NSString

时间:2013-05-14 18:24:05

标签: objective-c

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

var将是2。 所以为什么?我理解,这是关于动态打字的问题,但是什么是幕后的?

3 个答案:

答案 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);