Objective-C:对象实例指针

时间:2014-06-15 09:39:02

标签: objective-c cocoa object pointers

我是Objective-C的新手,并试图了解指针。这不是我的第一个停靠港;我希望有人能够辨别出我的困惑的根源,并用简单的英语解释这个概念。

在下面的代码中(来自Treehouse课程),创建了一个对象类的实例球,Sphere。

#import <Cocoa/Cocoa.h>
#import "Sphere.h"

int main()
{
Sphere *ball = [[Sphere alloc] init];

[ball setRadius:25];

NSLog(@"ball radius %f", [ball radius]);

return 0;
}

据我所知,在Objective-C中,对象类的所有实例都是指针。

我明白,球指针指向分配给球对象的记忆,就像别人在别处注意到的那样。

但实际内存分配方面发生了什么?

&#39;实例&#39;和指针&#39;同样的事情,同时创造?

2 个答案:

答案 0 :(得分:2)

Sphere *ball

这会分配一些足够大的内存以适合指针。 (在堆栈上)

[Sphere alloc]

这会在其他地方(在堆中)分配一些内存,足以容纳Sphere类的实例,并将所有实例变量设置为0.它返回为对象分配的空间的地址(换句话说,指针到新对象)。

[[Sphere alloc] init]

然后,init方法初始化所有字段和其他初始化。 (假设你在Sphere中覆盖了init,那么NSObject中init的实现什么都不做)。这与在对象本身的内存中分配空间无关,尽管它通常为对象引用的其他对象分配空间。它返回对象的内存地址,大多数时候这与alloc返回的地址相同。

然后[[Sphere alloc] init]返回的内存地址存储在ball变量中。 (由=

指针只是一个数字,一个与内存位置对应的内存地址。对象是类的实例,对象是指为对象分配的实际内存。

答案 1 :(得分:1)

实例指针并非100%相同,但在代码中它们都由ball变量表示。

您的问题的答案可以在以下行中找到:

Sphere *ball = [[Sphere alloc] init];

让我们仔细看看,这一行包含两个方法调用:allocinit

alloc是在NSObject中实施的类方法,在documentation中描述如下: 返回接收类的新实例。

这意味着此时,操作系统将为类型为Sphere对象分配内存。

init初始化程序,并在文档中描述如下: 由子类实现,在分配了内存之后立即初始化一个新对象(接收者)。您可以在Sphere类的实现中覆盖此方法以执行您自己的操作(通常你会在这里设置类的属性的值。

在执行了这行代码之后,您已经为类Sphere的实例分配了物理内存,并且2.初始化了相同的实例。这意味着此实例(或对象,这些术语是等效的)现在可供您使用了。

希望这有帮助!