繁体   English   中英

Objective-C:对象实例指针

[英]Objective-C: object instance 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中,对象类的所有实例都是指针。

我理解“球指针指向为球对象分配的内存”,正如其他人在我这里指出的那样。

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

“实例”和“指针”是同时创建的吗?

Sphere *ball

这样会分配一些内存,足以容纳一个指针。 (在堆栈上)

[Sphere alloc]

这会在其他地方(堆中)分配足够大的内存以适合Sphere类的实例,并将所有实例变量设置为0。它返回为对象分配的空间的地址(换句话说,指向新指针的指针)。宾语)。

[[Sphere alloc] init]

然后,init方法将初始化所有字段并进行其他初始化。 (假设您已在Sphere中覆盖了init,则在NSObject中实现init不会执行任何操作)。 这与为对象本身在内存中分配空间无关,尽管它通常为对象引用的其他对象分配空间。 它返回对象的内存地址,大多数情况下,它与alloc返回的地址相同。

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

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

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

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

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

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

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

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

init初始化程序,并在文档中进行了如下描述: 由子类实现,以在为其分配内存后立即初始化新对象(接收方)。 您可以在Sphere类的实现中重写此方法以执行您自己的修改(通常在此处为类的属性设置值)。

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

希望这可以帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM