在目标c中需要指针对象

v-i*_*a-l 7 memory-management objective-c ios

一个非常基本的问题......但是理解概念真的非常重要..在c ++或c语言中,我们通常不使用指针变量来存储值.即,值的存储方式简单如下:

int a=10;
Run Code Online (Sandbox Code Playgroud)

但是在ios sdk中,在目标c中,我们使用的大多数对象都是通过用它们表示指针来初始化的,如:

NSArray *myArray=[NSArray array];
Run Code Online (Sandbox Code Playgroud)

所以,在我的脑海中出现的问题是,使用指针对象的好处需求是什么(这就是我们在这里所称的,如果它不正确,请,请告诉我们.)我也有时会感到困惑使用指针对象进行分配时的内存分配基础.我可以在任何地方寻找好的解释吗?

小智 15

在c ++或c语言中,我们通常不使用指针变量来存储值

我会把那个"或C"部分拿出来.C++程序员在使用原始指针的皱眉,但C程序员没有.C程序员喜欢指针,并认为它们是解决所有问题的不可避免的银弹解决方案.(不,不是真的,但在C 中仍然经常使用指针)

但是在ios sdk中,在目标c中,我们使用的大多数对象都通过用它们表示指针来初始化

哦,仔细看看:

大多数对象

更接近:

对象

所以你在谈论Objective-C对象,amirite?(忽略C标准基本上将所有值和变量描述为"对象" 的微妙之处.)

它实际上只是Objective-C对象,它们始终是Objective-C中的指针.由于Objective-C是C的严格超集,所以在编写iOS应用程序(或OS X应用程序或任何其他基于Objective-C的程序)时,所有C语言和编程技术仍然适用.这是毫无意义的,多余的,浪费的,因此,写一些类似的东西甚至被认为是错误的

int *i = malloc(sizeof(int));
for (*i = 0; *i < 10; ++*i)
Run Code Online (Sandbox Code Playgroud)

只是因为我们在Objective-C土地上.基元(或更正确的"带有C++术语的普通旧数据类型")仍然遵循"如果不需要则不使用指针"规则.

使用指针对象有什么好处和需要

那么,为什么他们是必要的:

Objective-C是一种面向对象的动态语言.这两个与语言强烈相关的属性使程序员可以利用多态,鸭子类型动态绑定等技术(是的,这些是超链接,点击它们).

实现这些功能的方式使得必须通过指向它们的指针来表示所有对象.我们来看一个例子吧.

编写移动应用程序时的常见任务是从服务器检索某些数据.现代基于Web的API使用JSON数据交换格式来序列化数据.这是一种简单的文本格式,可以将其解析(例如,使用NSJSONSerialization类)到各种类型的数据结构及其相应的集合类中,例如a NSArray或an NSDictionary.这意味着,JSON解析器类/方法/函数返回的东西通用的,一些可以代表两个阵列和字典.

那么现在怎么办?我们不能返回非指针NSArrayNSDictionary结构(Objective-C对象实际上只是我知道Objective-C工作的所有平台上的简单旧C结构),因为它们具有不同的大小,它们具有不同的内存布局等等.编译器无法理解代码.这就是为什么我们返回指向类型的通用Objective-C对象指针id.

C标准规定指向structs(以及对象)的指针具有相同的表示和对齐要求(C99 6.2.5.27),即指向任何结构的指针可以安全地转换为指向任何其他结构的指针.因此,这种方法是正确的,我们现在可以返回任何对象.使用运行时内省,还可以动态确定对象的确切类型(类),然后相应地使用它.

为什么它们比非指针方便或更好(在某些方面):

使用指针,不需要传递同一对象的多个副本.创建大量副本(例如,每次将对象分配给或传递给函数时)都会很慢并导致性能问题 - 中等复杂的对象(例如视图或视图控制器)可能会有数十个副本实例变量,因此单个实​​例可以测量数百个字节.如果一个带有对象类型的函数调用在一个紧密的循环中被调用数千或数百万次,那么重新分配和复制它是非常痛苦的(无论如何对于CPU),并且更容易和更简单地传入一个指向对象的指针(尺寸较小,因此复制速度更快).此外,Objective-C是一种参考计数语言,甚至可以"劝阻"过度复制.保留和释放优于显式复制和释放.

另外,当使用指针对象进行分配时,我有时会对内存分配基础感到困惑

那么即使没有指针你也很可能很困惑.不要责怪指针,这是程序员的错误;-)

所以这里......

玩得开心!:-)

  • +1是一个非常彻底的答案.在Stackoverflow中有一个特殊的地方可以找到这个全面而且写得很好的答案. (4认同)