当我们真正想要从这个实例获取数据而不是地址时,有人可以解释为什么我们不会将“现在”的指针解除引用到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);
此代码很清楚。我们想要地址,我们得到它。但是,当我们继续使用指针时,如何通过更改说明符来获取实际日期?
答案 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]
方法以了解其文本表示。