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

Ios 在Objective-C中使用NSLog时取消对指针的引用,ios,objective-c,pointers,dereference,Ios,Objective C,Pointers,Dereference,好的,从这段代码中,我知道now是指向NSDate对象的指针,但是在第3行的代码中,如何取消引用没有星号的指针?我们为什么不在第三行编写这样的代码: NSDate *now = [NSDate date]; NSLog(@"This NSDate object lives at %p", now); NSLog(@"The date is %@", now); %@格式说明符获取指向对象的指针,因此无需取消对参数列表中指针的引用。一般来说,不需要取消对目标C对象指针的引用。%@获取指向对象的指

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

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

%@
格式说明符获取指向对象的指针,因此无需取消对参数列表中指针的引用。一般来说,不需要取消对目标C对象指针的引用。

%@
获取指向对象的指针并向其发送
说明
消息,该消息返回
NSString
指针。(您可以在类中重写
说明
,以自定义字符串。)


在回应评论时增加:

在Objective-C中,您需要使用
[objectPointer message]
语法通过指针向对象发送消息。因此,使用您的
NSDate
示例,您可以:

NSLog(@"The date is %@", *now);
从NSObject继承的类的任何实例都可以发送
说明
消息,因此指向它的指针可以传递到
%@
格式参数


(技术说明:如果对象支持
descriptionWithLocale:
消息,则将改为发送该消息。)

能否请您以不太专业的方式解释更多内容?虽然我对指针有很强的基础知识,但我对它还是新手。@user3090658。我更愿意说,我们使用%@通过指针向对象发送消息。这是在objective C中发送消息的方式。但是,这样做基本上是一种“取消引用”指针的方式,这是正确的(例如,如果消息收件人没有指向有效对象,则会出现异常)。但是在objective-C中,不需要在变量名前面加“*”就可以将它指向的对象发送到消息。@user3090658不,您只需要将对象(即通过其指针)传递到
%@
@user3090658。浮点是标量类型,而不是对象。另一方面,
NSString
是Objective-C对象。长话短说,从
NSObject
继承的所有内容都是Objective-C对象。@user3090658它不显示值。它显示对象的描述。
%@
格式说明符将通过调用
[object description]
并打印返回的字符串来询问对象的描述。您的意思是它将替换指针的星号,即我们可以使用%@取消对指针的引用。当您使用
%@
时,您只需将指针传递给对象即可。没有必要取消对指针的引用。Objective-C有处理Objective-C对象的特殊规则,这就是其中之一。Objective-C中的指针应该像不透明结构一样处理。这意味着你根本就不想去引用它们。(不要看幕后)所以将(NSString*)视为NSString对象,而不是指向NSString实例的指针。这就是(id)是泛型对象的原因。*是必要的,因为Obj-C本质上仍然是C,必须遵循某些规则。@LordAndrei说得很好。类周围的括号通常用于类型转换。这意味着我想告诉编译器,我宁愿相信变量就是我要告诉它的类型。这也是表示类类型的一种好方法。星号显然是指针。我指的是“类”是一个NSString指针。如果你不想编辑它,我想如果你在评论中再深入一点,就会有点偏离原来的问题。等你找到指向指针的地址,比如使用NSError。我的总体建议是阅读K&R(Kernigan和Richie)的C指南,以获得指针的深入而枯燥的视图。
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);