2008-12-28 75 views
2

我有時間理解Objective C中的指針。它們的行爲並不像我基於各種C教程所假設的那樣。Obj C - 理解指針

實施例:

// Define Name and ID 
NSString *processName = [[NSProcessInfo processInfo] processName]; 
NSNumber *processID = [NSNumber numberWithInt:[[NSProcessInfo processInfo] processIdentifier]]; 

// Print Name and ID 
NSLog(@"Process Name: %@ Process Identifier: %@", processName, processID); 

據我所知,processName是指向型的NSString的對象。 processID是一個指向NSNumber類型的對象的指針。當兩者都在NSLog()中調用時,它們的名稱前面沒有星號,因此應該返回指針值。爲什麼Obj C中沒有'地址'字符?爲什麼此代碼有效?

謝謝你的時間。

回答

11

目標c中的對象表示爲指向包含所有對象數據的c結構的指針。如果對象是一個實際的結構(而不​​是指向一個的指針),它就會像傳遞對象一樣作爲方法參數的效率變得非常低。所以一旦你初始化的對象:

NSString *aString = /* initial value */; 

你幾乎永遠只是使用指針ASTRING,而不是取消引用它(即* ASTRING)。

NSLog()函數中的%@標記期望指針類型,並將調用該對象的描述方法以確定要輸出的值。當在NSString對象上調用描述方法時,它會返回接收者,所以%@標記被輸出中字符串的內容替換。

7

格式字符串中的%@告訴NSLog在相關對象上調用-description,並使用該字符串作爲其顯示值。如果您確實需要指針的地址,則應在64位上使用%x%qx

+0

或者使用%p,它打印指針地址,指針的格式更好。 – mipadi 2008-12-28 02:28:37