如果我们输入
MyObject *obj = [[MyObject alloc] init];
“obj”是指向内存地址的指针。
...当我们创建一个 int 时,我们输入:
int x = 10;
我们为什么不打字?
int *x = 10;
问题是,为什么我们需要一个指向对象的指针而不是 int、float 等...
如果我们输入
MyObject *obj = [[MyObject alloc] init];
“obj”是指向内存地址的指针。
...当我们创建一个 int 时,我们输入:
int x = 10;
我们为什么不打字?
int *x = 10;
问题是,为什么我们需要一个指向对象的指针而不是 int、float 等...
将 int 从一个地方移动到另一个地方很容易。移动一个对象需要 CPU 做更多的工作。移动对象的地址就像移动 int 一样简单。
在纯 C 中,出于同样的原因,处理指向结构的指针是很常见的。C 语言使用 -> 操作符很容易。
在某些语言中,您可以在堆栈上“不使用指针”创建对象。例如,C++。将对象放在堆栈上的一大好处是它们会在作用域结束时自动释放,这有助于内存管理。它也更快。
将对象放在堆栈上的一件坏事是,当范围结束并且堆栈消失时,它们会自动释放。而且由于对象通常比局部变量寿命更长,因此您必须将对象的内存复制到某个地方。这是完全可能的,但它使事情复杂化。
而且,基于堆栈的对象不仅仅是内存生命周期复杂。考虑分配,foo = bar
对于两种对象类型。如果对象始终是指针 ( Class*
),您只需分配一个指针并获得两个指向相同对象的指针;简单的。如果foo
是基于堆栈的 ( Class
),则赋值语义开始变得模糊——你可以以原始对象的副本结束。
引入一个规则,即所有对象都在堆上分配(“使用指针”)是一个很好的简化。碰巧的是,速度差异并不重要,编译器现在还可以在超出范围后自动插入代码以释放基于堆的对象,因此这通常是双赢的局面。
你也可以有 int 和 float 的指针。
对象是在堆上创建的。要访问它,您需要地址。这就是为什么它们是指针类型的原因。
因为那是物体的本质。
Objective-C 直接派生自 C。这就是为什么对象被称为指针。内存地址大小的 int 类型变量是指针。最后,内存中的对象与内存中的结构没有太大区别。
但是,在使用 Objective-C 时,建议将这些变量视为对象的引用,而不是指向对象内存区域的指针。像 Java 一样思考它们,不要花太多心思在系统如何管理引用上。还有更重要的事情需要考虑,例如分配/保留与释放/自动释放或分别遵循更简单的 ARC 规则。
顺便提一句:
MyObject obj;
那将声明一个对象,而不是指针。这在 Objective-C (afaik) 中是不可能的,当然也不合理。但是,如果它是合理且可能的,那么这就是语法的样子。
int *x;
这确实创建了一个指向 int 的指针。要使用它,您必须分配内存并将其地址分配给 x。在 Objective C 中也很少合理,但在标准 C 中非常有用。
它是在堆栈或堆上的对象之间的区别。去int x = 10
x 现在在堆栈上。int *x = 10
只是错误的(很可能不是您想要的),因为它声明了一个指向地址 10 的指针,无论它可能是什么。你会想要int *x = malloc(sizeOf(int));
CodaFi 建议的。这将在一个 int 大小的堆上分配内存。
在MyObject *obj = [[Myobject alloc] init];
后台运行编译器是为您将对象分配到堆中,但其原理基本相同