任何人都可以解释一下,为什么我们不会将一个指针“now”取消引用到NSDate实例,当我们实际想要从这个实例获取数据而不是地址时.
NSDate *now = [NSDate date]; NSLog(@"The date is %@",now);
我很困惑的事实是,以前的Aaron Hillegass“Objective-C编程”书中使用的NSLog的例子是:
NSDate *now = [NSDate date]; NSLog(@"The new date lives at %p",now);
解决方法
“实际日期”是一个概念. “数据”是一系列字节.他们是不一样的事情.
如果你使用好的老式的C风格的字符串和printf,你可以这样写:
char *name = "Zakatov"; printf("My name is %s",name);
这是因为printf函数需要这个东西的地址来处理它.你没有传递“实际数据”,而是传递地址,因为传递地址是更有效率的.将某些东西传递给函数意味着将其值复制到存储器的堆栈区域,并且复制地址(32或64位)的速度要比复制整个字符串(几个字节,也可以是KB或MB)的速度更快.
所以在Objective-C中,我们一直处理对象的指针,因为指针是最简单的方法来引用它们.需要取消引用指针(查看字节)的唯一需要是运行时系统,例如当将消息选择器转换为函数地址以执行它们时.您的代码只将指针视为指针,并将其传递,而不用担心另一端的数据的精确布局(字节).