2013-04-14 78 views
3

我對NSLog的語法有點困惑。例如, NSLog指針語法

 
    NSString *nameString = @"Name"; 
    NSLog(@"nameString is: %@", nameString); 
如果我的理解是正確的(它很可能不是),那麼nameString被定義爲一個指向String的指針。然後我想,這將打印nameString保存的內存地址,而不是該地址的值。所以,如果這是真的,那麼在NSLog語句中,爲了獲得指針的值,我們不應該使用星號符號來訪問nameString指向的這樣的內容:
 
    NSLog(@"nameString is: %@", *nameString); 
? 從C編程開始已經有一段時間了,但是由於Objective-C是C的超集,我認爲它們的行爲是相似的。

解釋將不勝感激!謝謝!

+0

如果你想看到內存地址使用'%p' –

+0

謝謝,但我想解釋爲什麼在這種情況下nameString(一個指針)跟隨它指向的內存地址,並得到任何那裏(在這種情況下字符串「名稱」)。我不明白爲什麼這個工作。 –

+0

'...%@「,nameString]'擴展爲'[nameString description]' –

回答

13

命令%@就像調用方法-description在接收器上的「快捷方式」。對於一個NSString,它只是顯示字符串本身,因爲它是從NSObject繼承的,所以你可以覆蓋它,如果你爲自己的類創建的話非常有用。在這種情況下,默認行爲是打印指針的值。
如果你要打印的字符串中的指針的地址只是替換:

NSLog(@"nameString is: %p", nameString) 
+0

感謝您的回答!但不是接收者(nameString)在這種情況下只是一個整數(因爲它是一個指針)。我好像還有其他的事情發生在這裏,其中的變量nameString被跟蹤到內存位置,並且該值正在被抓取。 –

+0

First nameString不是int,而是一個「指針」。指針表示一個位置內存通常顯示爲十六進制數(可以轉換爲int),但概念遠離數字;其次是如何在objC中分派方法的一部分。要發送消息,您需要一個指向對象的指針並一條消息,當你發送消息時,會有一個方法調度器,它開始檢查你的對象類層次結構誰正在實現該方法並執行它(如果找到)。順便說一句,運行時的所有方法都是在C函數中「轉換」的。 – Andrea

+0

好吧,所以要發送這樣的消息:

 [nameString description]
,nameString必須是一個指針?那麼nameString指向的對象是否有調用它的方法? –

0

我認爲你使用星號只能申報一個指針。然後,你只使用你決定的名字。例如:

NSString *foo = [[NSString alloc] initWithString:@"Hello"]; 

NSLog(@"%@", foo); 

糾正我,如果我錯了:)

0

這是一個對象,並NSLog的是使用它的格式說明,以確定如何處理參數做一個功能。在這種情況下,說明符是%@,它告訴NSLog調用對象的方法。 通常這會調用方法「description」,它返回一個NSString,但它可能會首先響應方法,並落入其他一些字符串方法。