Objective-C 2.0中的类对象是什么?

use*_*710 6 objective-c

在2009年发布的名为Apple 的Objective-C 2.0编程语言的Objective C 2.0的官方文档中,有一个关于类对象的段落在第28页.

我不明白Class Objects是什么,以及如何定义它们除了语言的其余部分以及它们具有什么属性.在同一文档中,它解释了Objective-C 2.0中的所有内容都是一个对象,该对象基本上是指向struct包含isa字段的指针,指针本身是类型id.由此我推断:

  • Obj-C 2.0中的继承主要包括struct通过idisa字段 链接那些
    • 超类对象以isa指向nil对象的方式构造字段.
  • id 是Objective C 2.0中几乎所有内容的有效数据类型
  • 在定义类时,定义类本身的所有内容(方法和变量)都是从isa指针之后/下方开始打包的

假设我得到了Objective C 2.0的工作原理,什么是类对象,它与实例的创建方式有何不同?类对象提供的实例没有什么类型的属性?你可以与C或C++并行吗?

Chu*_*uck 5

好的,那么你定义一个类。我们称他为查理:

\n\n
@interface Charlie : NSObject\n@end\n
Run Code Online (Sandbox Code Playgroud)\n\n

我们的小班来啦!由于 \xe2\x80\x94 与 Obective-C \xe2\x80\x94 Charlie 中的所有其他类一样是一个对象,因此您可以向它发送消息,例如[Charlie alloc]让 Charlie 为您分配一个实例。这就是我们所说的类对象的含义:它是代表您定义的类的对象。

\n\n

Objective-C 中的对象是什么?类是基于此结构定义的:

\n\n
struct objc_object {\n    Class isa  OBJC_ISA_AVAILABILITY;\n};\n
Run Code Online (Sandbox Code Playgroud)\n\n

类由如下结构表示:

\n\n
struct objc_class {         \n    struct objc_class *isa; \n    struct objc_class *super_class; \n    // A bunch of other members \xe2\x80\xa6\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

如您所见,两者都以isa引用类开始。所以类只是普通对象的扩展。

\n\n

当 Charlie 创建一个实例时,该实例isa将指向 Charlie。但查理的是什么isa意思是什么?嗯,它指向一个元类。元类是一个奇怪的东西 \xe2\x80\x94 它是一种特殊的类,其存在只是为了充当类的类。你永远不会直接与它互动;当你与它的唯一实例 Charlie 交互时,它只是履行其优雅的职责\xe2\x80\xa0。

\n\n

这就是当我们谈论类对象 \xe2\x80\x94 时的意思,它只是代表您在代码中定义的类的对象。

\n\n

\xe2\x80\xa0 您可能想知道类的职责是什么。嗯,最明显的问题是这就是你创建对象的方式。但除此之外,Objective-C 中的实例不拥有自己的方法。相反,方法解析是根据对象的isa,因此类最重要的功能除了为您创建实例之外,就是确定您的对象具有哪些方法。

\n