我是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;同样的事情,同时创造?
答案 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];
让我们仔细看看,这一行包含两个方法调用:alloc
和init
。
alloc
是在NSObject
中实施的类方法,在documentation中描述如下:
返回接收类的新实例。
这意味着此时,操作系统将为类型为Sphere
的对象分配内存。
init
是初始化程序,并在文档中描述如下:
由子类实现,在分配了内存之后立即初始化一个新对象(接收者)。您可以在Sphere
类的实现中覆盖此方法以执行您自己的操作(通常你会在这里设置类的属性的值。
在执行了这行代码之后,您已经为类Sphere
的实例分配了物理内存,并且2.初始化了相同的实例。这意味着此实例(或对象,这些术语是等效的)现在可供您使用了。
希望这有帮助!