2013-05-14 59 views
2
NSString *string = [NSNumber numberWithInt:2]; 
int var = [string intValue]; 

var将为2. 那么,为什么?我明白,它对动态打字很关键,但底线是什么?指定NSNumber为NSString

+3

我没有看到任何铸件。你到底在问什么? – 2013-05-14 18:25:38

+0

有一个类型铸造。但它是隐含的。从ID到NSString *。但是,当然,他想说些不同的话。 – 2013-05-14 18:39:12

+0

@AminNegm-Awad,这不是铸造,这是动态打字。 – vikingosegundo 2013-05-14 18:39:47

回答

2

此代码示例中没有正在执行的操作:[string intValue]是由NSNumber提供的常规ObjectiveC方法,用于检索以整数形式存储在内部的值。您将对象指定给NSString指针的事实不会改变任何内容:内部对象仍为NSNumber。你不会因为Objective C是一种动态类型语言而崩溃。它可以让你指定错误类型的对象,但如果你试试你string对象上调用的NSString方法,你会得到一个崩溃:

NSString *string = [NSNumber numberWithInt:2]; 
int var = [string intValue];    // OK 
BOOL isTwo = [string isEqualToString:@"2"]; // Crash 
+0

我认为OP认为是因为他把他的'NSNumber'对象赋给了一个'NSString *'变量,在那里有一个字符串。 – 2013-05-14 18:26:35

+0

是的,主要问题是为什么代码有效? NSNumber被分配给NSString,然后intValue将该字符串转换为int。 – alex 2013-05-14 18:29:04

+2

@alex NSNumber对象被分配给恰好是'NSString'指针的指针变量,但分配的对象仍然是'NSNumber'。没有转换完成。当你调用'intValue'时,它在'NSNumber'对象上被调用。不涉及任何类型的字符串。 – rmaddy 2013-05-14 18:40:54

2

[string intValue]的调用是一个真正的message expression。这是可行的,因为string确实指向一个NSNumber对象,并且它响应intValue消息。如果您尝试发送特定于NSString类的消息(如rangeOfString),则会显示“无法识别选择器”错误。

如果您在调试器中运行此操作并在其中放置断点,则会看到运行时知道string的类型实际上是NSNumber

1

没有类型化它只是存储参考NSNumber然后再转换回来。你甚至不需要NSString这将与id

id this = [NSNumber numberWithInt:22]; 
    int val = [this intValue]; 
    NSLog(@"%d",val);