Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/117.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 为什么对象有指针而不是int?_Ios_Objective C_Pointers - Fatal编程技术网

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

Ios 为什么对象有指针而不是int?,ios,objective-c,pointers,Ios,Objective C,Pointers,如果我们打字 MyObject *obj = [[MyObject alloc] init]; “obj”是指向内存地址的指针 …创建int时,我们键入: int x = 10; 我们为什么不打字呢 int *x = 10; 问题是,为什么我们需要一个指向对象的指针,而不是int、float等 您可以将指针用于int和float 对象是在堆上创建的。要访问它,您需要地址。这就是为什么它们是指针类型。因为这是对象的本质 Objective-C直接从C派生而来。这就是对象被称为指针的原因。

如果我们打字

MyObject *obj = [[MyObject alloc] init];
“obj”是指向内存地址的指针

…创建int时,我们键入:

int x = 10; 
我们为什么不打字呢

int *x = 10; 

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

您可以将指针用于int和float


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

因为这是对象的本质

Objective-C直接从C派生而来。这就是对象被称为指针的原因。内存地址大小的int类型变量是指针。 最后,内存中的对象与内存中的结构没有太大区别

然而,在Objective-C中工作时,建议将这些变量视为对象的引用,而不是指向对象内存区域的指针。像Java一样考虑它们,不要花太多心思在系统如何管理引用上。还有更重要的事情要考虑,比如alloc/retain与release/autorelease,或者分别遵循更简单的ARC规则

顺便说一句:

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

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

效率。 将int从一个位置移动到另一个位置很容易。移动对象需要CPU做更多的工作。移动对象的地址和移动int一样简单


在普通C中,出于同样的原因处理指向结构的指针是很常见的。C使->操作符变得简单。

这是堆栈或堆上的对象之间的区别。 运行
intx=10
x现在在堆栈上
int*x=10
完全是错误的(很可能不是您想要的),因为它声明了一个指向地址10的指针,不管它是什么。您需要
int*x=malloc(sizeOf(int))如CodaFi所建议。这将在int大小的堆上分配内存


继续
MyObject*obj=[[MyObject alloc]init]后台编译器正在为您将对象分配到堆中,但其基本原理相同

有些语言可以在堆栈上“无需指针”创建对象。举例来说,C++。在堆栈上拥有对象的一个好处是,当作用域结束时,它们会自动解除分配,这有助于内存管理

堆栈上有对象的一个缺点是,当作用域结束并且堆栈消失时,对象会自动被解除分配。由于对象通常比局部变量更长寿,因此必须将对象的内存复制到某个地方。这完全有可能,但会使事情复杂化

而且不仅仅是内存生命周期对基于堆栈的对象很复杂。考虑两个对象类型的赋值,<代码> fo= bar < /代码>。如果对象始终是指针(
Class*
),则只需分配一个指针,就可以得到两个指向相同对象的指针;容易的。如果
foo
是基于堆栈的(
Class
),则赋值语义开始变得模糊,很可能以原始对象的副本结束


引入所有对象都在堆上分配的规则(“使用指针”)是一个极大的简化。事实上,速度差异并不重要,编译器现在还可以在堆对象超出范围后自动插入代码以释放它们,因此这通常是一种双赢的情况。

您可以指向int。只要
malloc(sizeOf(int))
。通读一些C文档,然后。如果它不回答你的问题,那么如果Objul-C的对象被堆栈分配了可能的重复的<代码> INT/COM>,<代码>浮点< /代码>等,那么Objy-C将失去它的大部分内存活力。是标量数据类型-也称为原语(当谈论C或Objective-C时)。它们不必在堆上分配(alloc/init/new),但可以在堆栈上分配。我想他真的想知道为什么我们在Objective-C中进行堆分配,而不是我们只是在做,为什么我们要在堆上分配对象,在堆栈上分配int?为了实现Obj-C提供的灵活性。@Apurv如果这是指向对象的任何推理,那么int就是对象。毕竟,如果我能像你说的那样堆分配一个int或float,为什么对象会得到所有的乐趣呢?在你的回答中包括这一点,我还想说堆是唯一可以安全地对内存进行引用计数的地方,这是ObjC@CodaFi-堆、堆栈和引用计数是附带现象。当您声明一个int变量时,您不需要关心它实际位于何处,也不需要关心它是否被正确释放。您只关心它的范围,而该语言以静默方式处理实现细节。对象也可以这样做。@mouviciel也可以这样做,局部变量也可以这样做,但对于ObjC中的永久性和引用管理,特别是对于ObjC,该语言不处理任何事情,它完全是编译器,可以在翻转标志时关闭。引用计数并没有消失,它只是被抽象掉了。在一种仍然(现在)依赖于显式运行时保留和释放的语言中,将其称为附带现象是错误的。@zoul。这就是为什么块最初是在堆栈上分配的(也就是说,它们往往是短期的),然后如果它们需要超过其函数的作用域,就被复制到堆上。啊,我想我知道我们在哪里彼此不了解。正如你所说,实际上有两件独立的事情:在h上分配
int *x;