【问题标题】:Dereferencing a pointer when using NSLog in Objective-C在 Objective-C 中使用 NSLog 时取消引用指针
【发布时间】:2014-01-07 12:56:05
【问题描述】:
NSDate *now = [NSDate date];
NSLog(@"This NSDate object lives at %p", now);
NSLog(@"The date is %@", now);

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

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

【问题讨论】:

  • 等到你得到指向指针的地址,比如使用 NSError。我的一般建议是阅读 K&R(Kernigan 和 Richie)的 C 指南,以深入了解指针,尽管是枯燥的。

标签: ios objective-c pointers dereference


【解决方案1】:

%@ 获取一个指向对象的指针并将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 之类的。我更愿意说我们使用 %@ 通过指针向对象发送消息。这是目标 C 中发送消息的方式。但是,您是正确的,这样做基本上是一种“取消引用”指针的方式(例如,如果消息接收者未指向有效对象,则会出现异常)。但在 Objective-C 中,您不需要在变量名称前加上“*”,以便将它指向的对象发送到消息。
  • @user3090658 不,您只会将对象(即通过它们的指针)传递给%@
  • @user3090658 float 是标量类型,而不是对象。另一方面,NSString 是一个 Objective-C 对象。长话短说,从 NSObject 继承的所有东西都是一个 Objective-C 对象。
  • @user3090658 它不显示值。它显示了对象的描述。 %@ 格式说明符将通过调用 [object description] 并打印返回的字符串来询问对象的描述。
【解决方案2】:

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

【讨论】:

  • 你的意思是它替换了我们可以使用 %@ 取消引用指针的指针的星号符号
  • 当您使用%@ 时,您只需将指针传递给对象。无需取消引用指针。 Objective-C 有处理 Objective-C 对象的特殊规则,这就是其中之一。
  • 目标 C 中的指针应被视为不透明结构。这意味着您根本不打算取消引用它们。 (不要看幕后)所以将 (NSString*) 视为 NSString 对象而不是指向 NSString 实例的指针。这就是为什么 (id) 是通用对象。 * 是必要的,因为本质上 Obj-C 仍然是 C,并且必须遵循某些规则。
  • @LordAndrei 说得好。
  • 类周围的括号通常用于类型转换。这意味着我想告诉编译器我宁愿相信变量是我告诉它的类型。这也是表示类类型的好方法。星号显然是一个指针。所以我的意思是“类”是一个 NSString 指针。除非您想对其进行编辑,否则我认为在 cmets 中深入研究会有点偏离原始问题。
猜你喜欢
  • 1970-01-01
  • 2019-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-23
  • 2020-03-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多