在c++或c语言中,我们通常不使用指针变量来存储值
我会把“或C”部分去掉。 C++程序员do不赞成使用原始指针,但 C 程序员却不这么认为。 C 程序员喜欢指针,并将其视为解决所有问题的必然灵丹妙药。 (不,不是真的,但是指针仍然是非常频繁地在C中使用。)
但在ios sdk中,在objective c中,我们使用的大多数对象都是通过用它们表示指针来初始化的
哦,仔细看看:
大多数物体
更接近:
objects
所以你在谈论 Objective-C 对象,amirite? (忽略 C 标准本质上描述的微妙之处all值和变量作为“对象”。)
实际上,Objective-C 对象始终是 Objective-C 中的指针。由于 Objective-C 是 C 的严格超集,因此在编写 iOS 应用程序(或 OS X 应用程序,或任何其他基于 Objective-C 的程序)时,所有 C 习惯用法和编程技术仍然适用。它是无意义、多余、浪费,因此甚至被认为是错误写一些类似的东西
int *i = malloc(sizeof(int));
for (*i = 0; *i < 10; ++*i)
只是因为我们身处 Objective-C 的土地。基元(或更准确地说,C++ 术语中的“普通旧数据类型”)仍然遵循“如果不需要,请勿使用指针”规则。
使用指针对象的好处和需要是什么
那么,为什么它们是必要的:
Objective-C 是一种面向对象的动态语言。该语言的这两个密切相关的属性使程序员可以利用以下技术:多态性 http://en.wikipedia.org/wiki/Polymorphism_(computer_science), 鸭子打字 http://en.wikipedia.org/wiki/Duck_typing and 动态绑定 http://en.wikipedia.org/wiki/Late_binding(是的,这些是超链接,单击它们)。
这些功能的实现方式使得所有对象都必须由指向它们的指针来表示。让我们看一个例子。
编写移动应用程序时的一个常见任务是从服务器检索一些数据。现代基于 Web 的 API 使用 JSON 数据交换格式来序列化数据。这是一种可以解析的简单文本格式(例如,使用NSJSONSerialization
class)转换为各种类型的数据结构及其对应的集合类,例如NSArray
or an NSDictionary
。这意味着 JSON 解析器类/方法/函数必须返回一些东西generic,可以代表的东西both一个数组和一个字典。
那么现在怎么办?我们无法返回非指针NSArray
or NSDictionary
struct(Objective-C 对象实际上只是我知道 Objective-C 工作的所有平台上的普通旧 C 结构),因为它们具有不同的大小,它们具有不同的内存布局等。编译器无法理解的代码。这就是为什么我们返回一个指向通用 Objective-C 对象的指针,类型的id
.
C 标准强制要求指向struct
s(以及对象)具有相同的表示和对齐要求(C99 6.2.5.27),i。 e.指向任何结构的指针都可以安全地转换为指向任何其他结构的指针。因此,这种方法是正确的,我们现在可以返回任何对象。使用运行时自省,还可以动态确定对象的确切类型(类),然后相应地使用它。
以及为什么它们更方便或更好(在某些方面)比非指针:
使用指针,无需传递同一对象的多个副本。创建大量副本(例如,每次将对象分配给或传递给函数时)可能会很慢并导致性能问题 - 一个中等复杂的对象,例如视图或视图控制器,可以有数十个副本。实例变量,因此单个实例实际上可以测量数百个字节。如果一个采用对象类型的函数调用在一个紧密的循环中被调用数千或数百万次,那么重新分配和复制它是相当痛苦的(无论如何对于CPU来说),并且只传递一个更容易和更直接的方法指向对象的指针(该对象的大小较小,因此复制速度更快)。此外,Objective-C 作为一种引用计数语言,甚至“不鼓励”过度复制。保留和释放优于显式复制和释放。
另外,当使用指针对象进行分配时,我有时会对内存分配基础知识感到困惑
那么你很可能已经很困惑了without指针。不要将其归咎于指针,这只是程序员的错误;-)
所以这里...
- ...Apple 的官方文档和内存管理指南 https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/MemoryMgmt.html;
- ...我能找到的最早相关的 Stack Overflow 问题 https://stackoverflow.com/questions/710288/where-are-the-best-explanations-of-memory-management-for-iphone;
- ...在尝试继续 Objective-C 编程 #1 之前你应该阅读的内容 http://c-faq.com/malloc/index.html; (即先学习C)
- ...在尝试继续 Objective-C 编程之前应该阅读的内容 #2 http://c-faq.com/ptrs/index.html;
- ...在尝试继续 Objective-C 编程之前应该阅读的内容 #3 http://c-faq.com/aryptr/index.html;
- ...以及一个关于 C 内存管理规则、技术和习惯用法的旧 Stack Overflow 问题 https://stackoverflow.com/questions/24891/c-memory-management;
玩得开心! :-)