2013-05-14 80 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);