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

jer*_*rry 24 macos cocoa metaclass class objective-c

好吧,所以我理解一个对象是一个必须分配和初始化的类的实例,但类本身是对象吗?

我知道当你创建一个新类时,它是一个其他的实例,比如NSObject.所以,如果这使它成为一个类,那么对象不仅可以容纳变量和方法,还可以容纳其他对象,对吧?

对不起,这可能是非常基本的,但我正在读两本关于可可和xcode的书,这一点有点不清楚(可能是因为我缺乏其他语言的经验).

Reg*_*ent 34

是格雷格帕克对此事的一个非常好的解释

引用:

[...]每个Objective-C类也是一个对象.它有一个isa指针和其他数据,可以响应选择器.当您调用[NSObject alloc]之类的"类方法"时,实际上是在向该类对象发送消息.

由于类是对象,因此它必须是其他类的实例:元类.元类是类对象的描述,就像类是普通实例的描述一样.特别是,元类的方法列表是类方法:类对象响应的选择器.当您向类(一个元类的实例)发送消息时,objc_msgSend()会查看元类的方法列表(及其超类,如果有的话),以确定要调用的方法.类方法由类对象代表类对象描述,就像实例方法由类代表实例对象描述一样.

元类怎么样?它是元类吗?不.元类是根类的元类的实例; 根元类本身就是根元类的一个实例.isa链在这里循环结束:实例到类到元类到根元类到它自己.元类的行为很少很重要,因为在现实世界中没有人向元类对象发送消息.[...]

更有趣的读物:

了解 Colin Wheeler 的Objective-C运行时
(搜索标题为"So Classes define objects ..."的段落)

Objective-C中的元类是什么?作者:Matt Gallagher