在Objective-C中使用NSLog时取消引用指针

use*_*658 9 pointers objective-c dereference ios

NSDate *now = [NSDate date];
NSLog(@"This NSDate object lives at %p", now);
NSLog(@"The date is %@", now);
Run Code Online (Sandbox Code Playgroud)

好的,从这段代码中,我知道这now是一个指向NSDate对象的指针,但是在第3行的代码中,如何在没有星号的情况下取消引用指针?为什么我们不在第3行做这样的代码:

NSLog(@"The date is %@", *now);
Run Code Online (Sandbox Code Playgroud)

god*_*el9 10

%@格式说明需要一个指向对象的指针,所以没有必要取消引用参数列表中的指针.通常,不需要取消引用Objective C对象的指针.


Tur*_*rix 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);
Run Code Online (Sandbox Code Playgroud)

可以向description消息发送任何继承自NSObject的类的实例,因此可以将指向它的指针传递给%@format参数.

(技术说明:如果对象支持该descriptionWithLocale:消息,则会发送该消息.)

  • @ user3090658那种.我更愿意说我们使用%@通过指针向对象发送消息.这是在目标C中发送消息的方式.但是,您这样做基本上是一种"解除引用"指针的方式是正确的(例如,如果消息接收者没有指向有效对象,则会出现异常).但是在objective-C中,您不需要在变量名前加上"*",以便将它指向的对象发送给消息. (2认同)
  • @ user3090658 float是标量类型而不是对象.另一方面,`NSString`是Objective-C对象.简而言之,从"NSObject"继承的所有内容都是Objective-C对象. (2认同)