在 c++ 或 c 语言中,我们通常不使用指针变量来存储值
我会把那个“或C”部分去掉。C++ 程序员确实不赞成使用原始指针,但 C 程序员不会。C 程序员喜欢指针,并认为它们是解决所有问题的必经之路。(不,不是,但指针在 C 中仍然非常频繁地使用。)
但是在ios sdk中,在objective c中,我们使用的大多数对象都是通过用它们表示一个指针来初始化的
哦,仔细看:
大多数对象
更接近:
对象
所以你在谈论Objective-C对象,amirite?(忽略 C 标准本质上将所有值和变量描述为“对象”的微妙之处。)
在 Objective-C 中,实际上只是 Objective-C 对象始终是指针。由于 Objective-C 是 C 的严格超集,所有 C 习语和编程技术在编写 iOS 应用程序(或 OS X 应用程序,或任何其他基于 Objective-C 的程序)时仍然适用。这是毫无意义的,多余的,浪费的,因此,编写类似的东西甚至被认为是错误的
int *i = malloc(sizeof(int));
for (*i = 0; *i < 10; ++*i)
仅仅因为我们在 Objective-C 领域。基元(或更准确地说是使用 C++ 术语的“普通旧数据类型”)仍然遵循“如果不需要,不要使用指针”规则。
使用指针对象有什么好处和需要
那么,为什么它们是必要的:
Objective-C 是一种面向对象的动态语言。语言的这两个密切相关的属性使程序员可以利用多态性、鸭子类型和动态绑定等技术(是的,这些是超链接,单击它们)。
这些特性的实现方式使得所有对象都必须由指向它们的指针来表示。让我们看一个例子。
编写移动应用程序时的一项常见任务是从服务器检索一些数据。现代基于 Web 的 API 使用 JSON 数据交换格式来序列化数据。这是一种简单的文本格式,可以解析(例如,使用NSJSONSerialization
类)为各种类型的数据结构及其对应的集合类,例如 anNSArray
或 an NSDictionary
。这意味着 JSON 解析器类/方法/函数必须返回一些通用的东西,可以代表数组和字典的东西。
那么现在怎么办?我们不能返回非指针NSArray
或NSDictionary
结构(Objective-C 对象实际上只是在我知道 Objective-C 工作的所有平台上的普通旧 C 结构),因为它们具有不同的大小,它们具有不同的内存布局等。编译器无法理解代码。这就是为什么我们返回一个指向通用 Objective-C 对象的指针,类型为id
.
C 标准要求指向struct
s(以及指向对象)的指针具有相同的表示和对齐要求(C99 6.2.5.27),即指向任何结构的指针可以安全地转换为指向任何其他结构的指针。因此,这种方法是正确的,我们现在可以返回任何对象。使用运行时自省,还可以动态确定对象的确切类型(类),然后相应地使用它。
以及为什么它们比非指针更方便或更好(在某些方面) :
使用指针,无需传递同一对象的多个副本。创建大量副本(例如,每次将对象分配给或传递给函数时)可能会很慢并导致性能问题 - 一个中等复杂的对象,例如视图或视图控制器,可能有几十个实例变量,因此单个实例实际上可以测量数百个字节。如果一个采用对象类型的函数调用在一个紧密的循环中被调用数千或数百万次,那么重新分配和复制它是非常痛苦的(无论如何对于 CPU 来说),并且只传递一个更容易和更直接指向对象的指针(它的大小更小,因此复制速度更快)。此外,作为一种参考计数语言,Objective-C 甚至有点“不鼓励”过度复制。
此外,在使用指针对象进行分配时,我有时会对内存分配基础知识感到困惑
那么即使没有指针,您也很可能会感到困惑。不要将其归咎于指针,这是程序员的错误;-)
所以这里...
玩得开心!:-)