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);
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);
%@
需要一個指向對象的指針,並將其發送給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:
消息,它會發送該網址。)
你能用更少的技術方式解釋更多嗎?儘管我對指針有很強的基礎知識,但我對此並不陌生。 – user3090658
@ user3090658好的,我將添加到我的答案... – Turix
這是否意味着我們使用%@取消引用指針而不是*符號? – user3090658
的%@
格式說明需要一個指向對象的指針,所以沒有必要取消引用參數列表中的指針。通常,不需要取消引用Objective C對象的指針。
你的意思是它取代了指針的星號標誌,我們可以使用解引用%@ – user3090658
當您使用'%@'指針,你只是傳遞指針的對象。沒有必要取消引用指針。 Objective-C有處理Objective-C對象的特殊規則,這就是其中之一。 – godel9
目標C中的指針應該像不透明結構一樣對待。這意味着你實際上並不打算對它們進行解引用。 (不要看窗簾後面),所以把(NSString *)看作是一個NSString對象,而不是一個指向NSString實例的指針。這就是爲什麼(id)是通用對象。 *是必要的,因爲在內心Obj-C仍然是C並且必須遵循某些規則。 –
等到你的地址給喜歡使用NSError指針。我的一般建議是閱讀K&R(Kernigan和Richie)的C指南,儘可能深入地理解指針的幹觀。 –