取消引用Objective-C中的指针

时间:2012-01-02 21:02:59

标签: objective-c pointers

当我们真正想要从这个实例获取数据而不是地址时,有人可以解释为什么我们不会将“现在”的指针解除引用到NSDate实例。

NSDate *now = [NSDate date];
NSLog(@"The date is %@", now);

我感到困惑的一个原因是,前面的NSLog在Aaron Hillegass“Objective-C Programming”一书中使用的例子是:

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

此代码很清楚。我们想要地址,我们得到它。但是,当我们继续使用指针时,如何通过更改说明符来获取实际日期?

4 个答案:

答案 0 :(得分:8)

名为now的变量包含对内存位置的引用。要取消引用指针,您必须使用*像在C中一样。

%@是用于打印对象description(由其description方法返回的字符串)的格式说明符。

int a = 1;
int *b = &a;  // a pointer
int c = *b;   // here you dereference b

答案 1 :(得分:8)

“实际日期”是一个概念。 “数据”是一系列字节。它们不是一回事。

如果您使用的是老式的C风格字符串和printf,您可以写下:

char *name = "Zakatov";
printf("My name is %s", name);

这是因为printf函数需要使用它的地址。您没有传递“实际数据”而是传递地址,因为传递地址更有效率。将某些内容传递给函数意味着将其值复制到内存的堆栈区域,复制地址(32位或64位)比复制整个字符串(几个字节,或者KB或MB)更快。

所以在Objective-C中我们一直处理指向对象的指针,因为指针是引用它们的最简单方法。唯一需要取消引用指针(查看字节)的是运行时系统,例如,当它将消息选择器转换为函数地址以执行它们时。您的代码只是将指针视为指针,并将其传递而不必担心另一端数据的精确布局(字节)。

答案 2 :(得分:2)

在Objective-C中,您永远不会取消引用指向对象的指针(就像使用指向结构的指针一样)。例如,它与Java引用没有什么不同。

问题是:您希望从NSDate获得哪些数据?你应该通过方法获得这些数据。

答案 3 :(得分:2)

您不能取消引用它,因为所有Objective-C类型都是接口。在字段方面,你不知道指针背后是什么;实际上,您的NSDate对象可能甚至不是NSDate类的实例。它恰好实现了所有方法NSDate公开。

指针足以调用方法,但如果您无法确定是否真正处理NSDate对象,则最好不要尝试直接访问任何字段。因此,如果要从对象获取信息,则需要使用其方法。

Cocoa函数和方法中的%@格式说明符意味着应该在指针上调用-[NSObject description]方法以了解其文本表示。