关于obj-c中的“类”类?

时间:2013-09-07 19:25:26

标签: objective-c

请遵守此方法声明:

NSString *NSStringFromClass(Class aClass);

我想了解Class类,但我找不到关于它的文档,因为我不知道如何创建一个足够好的正则表达式并使用它进行谷歌搜索。类名为Class而非NSClass这一事实让我觉得Class不是真正的类(如java.lang.Class)。但是,我不知道,所以我想研究这个。但是,我找不到文档。

如果我需要提出特定问题: obj-c中的“类”是真正的类吗?它的方法和属性是什么?

1 个答案:

答案 0 :(得分:5)

引自Cocoa with Love

  

每个对象都有一个类。这是一个基本的面向对象概念,但在Objective-C中,它也是数据的基本部分。任何具有指向正确位置的类的指针的数据结构都可以视为对象。   在Objective-C中,对象的类由其isa指针确定。 isa指针指向对象的Class。

作为证明,这里是id作为指向objc_object结构的指针的声明。

typedef struct objc_object {
    Class isa;
} *id;

所以我们明白了。什么是Class

让我们来看看定义

Class定义如下(实际上可能因运行时而异,但让我们保持简单)

struct objc_class {
    Class isa;
}
typedef struct objc_class *Class;

正如您所看到的,Class也有一个isa指针。它看起来很像objc_object定义,原因很简单:Class实际上是一个对象。

Class的班级是什么?根据定义,它是一个元类。

根据相同的来源(以粗体显示直接解决您问题的部分),

  

元类与之前的Class一样,也是一个对象。这意味着您也可以在其上调用方法。当然,这意味着它也必须有一个类。

     

所有元类都使用基类的元类(其继承层次结构中顶层Class的元类)作为它们的类。这意味着对于从NSObject(大多数类)下降的所有类,元类具有NSObject元类作为其类。

     

遵循所有元类使用基类的元类作为其类的规则,任何基类元类都将是它自己的类(它们的isa指针指向它们自己)。这意味着NSObject元类上的isa指针指向它自己(它是它自己的一个实例)。

关于这个问题的进一步阅读,这是格雷格帕克的另一个great explanation