2013-12-19 14 views
9
NSDate *now = [NSDate date]; 
NSLog(@"This NSDate object lives at %p", now); 
NSLog(@"The date is %@", now); 

好,從這個代碼解引用指針,我知道now是一個指向NSDate對象,但在第3行代碼,你怎麼能解引用沒有指針星號?爲什麼我們不能做這樣的代碼3號線:在Objective-C使用的NSLog時

NSLog(@"The date is %@", *now); 
+0

等到你的地址給喜歡使用NSError指針。我的一般建議是閱讀K&R(Kernigan和Richie)的C指南,儘可能深入地理解指針的幹觀。 –

回答

7

%@需要一個指向對象的指針,並將其發送給description消息,該消息返回NSString指針。 (您可以在類覆蓋description自定義字符串)。


新增迴應評論:

在Objective-C,你通過使用[ objectPointer message ]語法的指針將消息發送到的對象。因此,使用NSDate例如,你可以這樣做:

NSDate * now = [NSDate date]; 
NSString * dateDescription = [now description]; // Note that "now" points to an object and this line sends it the "description" message 
NSLog(dateDescription); 

從NSObject的繼承的類的任何實例可以發送description消息,因此它的指針可以傳遞給%@格式參數。

(技術說明:如果對象支持descriptionWithLocale:消息,它會發送該網址。)

+0

你能用更少的技術方式解釋更多嗎?儘管我對指針有很強的基礎知識,但我對此並不陌生。 – user3090658

+0

@ user3090658好的,我將添加到我的答案... – Turix

+0

這是否意味着我們使用%@取消引用指針而不是*符號? – user3090658

10

%@格式說明需要一個指向對象的指針,所以沒有必要取消引用參數列表中的指針。通常,不需要取消引用Objective C對象的指針。

+0

你的意思是它取代了指針的星號標誌,我們可以使用解引用%@ – user3090658

+0

當您使用'%@'指針,你只是傳遞指針的對象。沒有必要取消引用指針。 Objective-C有處理Objective-C對象的特殊規則,這就是其中之一。 – godel9

+1

目標C中的指針應該像不透明結構一樣對待。這意味着你實際上並不打算對它們進行解引用。 (不要看窗簾後面),所以把(NSString *)看作是一個NSString對象,而不是一個指向NSString實例的指針。這就是爲什麼(id)是通用對象。 *是必要的,因爲在內心Obj-C仍然是C並且必須遵循某些規則。 –