为什么对象有指针而不是int?

时间:2013-03-28 08:06:45

标签: ios objective-c pointers

如果我们输入

MyObject *obj = [[MyObject alloc] init];

“obj”是指向内存地址的指针。

...当我们创建一个int时,我们输入:

int x = 10; 

我们为什么不打字?

int *x = 10; 

问题是,为什么我们需要一个指向对象的指针而不是int,float等......

5 个答案:

答案 0 :(得分:9)

效率。

将int从一个地方移动到另一个地方很容易。移动对象需要CPU的更多工作。移动对象的地址就像移动int一样简单。

在普通的C中,出于同样的原因,通常会处理指向结构的指针。使用 - > C可以轻松实现操作

答案 1 :(得分:2)

有些语言可以在堆栈上“无指针”创建对象。例如,C ++。在堆栈上拥有对象的一个​​好处是它们在范围结束时自动解除分配,这有助于内存管理。 It’s also faster

在堆栈上拥有对象的一个​​坏处是,当作用域结束并且堆栈消失时,它们会自动解除分配。而且由于对象通常比局部变量寿命更长,因此您必须在某处复制对象的内存。这完全有可能,但它使问题复杂化。

并不仅仅是基于堆栈的对象复杂的内存生命周期。考虑为两个对象类型赋值foo = bar。如果对象始终是指针(Class*),那么您只需指定一个指针并获得指向相同对象的两个指针;简单。如果foo是基于堆栈的(Class),则赋值语义开始变得模糊 - 您最终可能会以原始对象的副本结束。

引入一个规则,即在堆上分配所有对象(“使用指针”)是一个很大的简化。事实上,速度差异并不重要,编译器现在也可以自动插入代码以在超出范围后解除分配基于堆的对象,因此通常是双赢的。

答案 2 :(得分:1)

你也可以有int,float的指针。

在堆上创建对象。要访问它,您需要地址。这就是为什么它们是指针类型。

答案 3 :(得分:1)

因为这是对象的本质。

Objective-C直接从C开始。这就是为什么对象被称为指针。内存地址大小的int型变量是指针。 最后,内存中的对象与内存中的结构没有太大区别。

但是,在Objective-C中工作时,建议将这些变量视为对象的引用,而不是指向对象内存区域的指针。像Java一样考虑它们,并且不要过多考虑系统如何管理引用。还有更重要的事情需要考虑,例如alloc / retain与release / autorelease或分别遵循更容易的ARC规则。

BTW:

MyObject obj;

那会声明一个对象,而不是一个指针。在Objective-C(afaik)中是不可能的,当然也不合理。但如果它合理且可能,那就是语法的样子。

int *x; 

这确实创建了一个指向int的指针。要使用它,您必须分配内存并将其地址分配给x。在Objective C中更合理,但在标准C中非常有用。

答案 4 :(得分:1)

它在堆栈或堆上的对象之间的区别。 go int x = 10 x现在在堆栈上。 int *x = 10只是完全错误(很可能不是你想要的),因为它声明指向地址10的指针。你希望CodaFi建议你int *x = malloc(sizeOf(int));。这将在int的大小的堆上分配内存。

go MyObject *obj = [[Myobject alloc] init];幕后的编译器是为你分配你的对象到堆,但它的原理基本相同