繁体   English   中英

取消引用Objective-C中的指针

[英]Dereferencing a pointer in Objective-C

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM