Objective-C中的类是对象吗?

25

好的,我知道对象是必须被分配和初始化的类的实例,但是类本身是否也是对象呢?

我知道当你创建一个新的类时,它是另一个东西的实例,比如NSObject。那么,如果这使它成为一个类,那么对象不仅可以持有变量和方法,而且还可以持有其他对象,对吗?

抱歉,可能这很基础,但我正在阅读两本关于Cocoa和Xcode的书籍,这一点有点不清楚(可能是因为我在其他语言方面缺乏经验)。


我认为你在谈论元类?http://cocoawithlove.com/2010/01/what-is-meta-class-in-objective-c.html - manojlds
1个回答

35

这里是Greg Parker对于这个问题的一个非常好的解释:

引用如下:

每个Objective-C类都是一个对象,它有一个isa指针和其他数据,并且可以响应选择器。当您调用像[NSObject alloc]这样的“类方法”时,实际上是向该类对象发送消息。
由于类是一个对象,因此它必须是某个其他类的实例:元类。元类是类对象的描述,就像类是普通实例的描述一样。特别是,元类的方法列表是类方法:类对象响应的选择器。当您向类 - 元类的实例发送消息时,objc_msgSend()会查看元类的方法列表(以及其任何超类)以决定调用哪个方法。类方法由元类代表类对象描述,就像实例方法由类代表实例对象描述一样。
那么元类呢?是所有方法都是元类吗?不是。元类是根类的元类的实例;根元类本身是根元类的实例。在这里,isa链以循环结束:实例到类到元类到根元类到自身。由于在真实世界中没有人向元类对象发送消息,因此元类isa指针的行为很少有影响。[...]
更多有趣阅读:

Objective-C运行时的理解 by Colin Wheeler
(搜索段落标题“所以类定义了对象…”)

什么是Objective-C中的元类? by Matt Gallagher


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接