【问题标题】:regarding the "Class" class in obj-c?关于 obj-c 中的“类”类?
【发布时间】:2013-09-07 19:25:25
【问题描述】:

请遵守此方法声明:

NSString *NSStringFromClass(Class aClass);

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

如果我需要问一个具体的问题: obj-c 中的“类”是真正的类吗?它的方法和属性是什么?

【问题讨论】:

  • 这是在(相当糟糕的)Apple 文档中隐藏得很好的东西之一,但它非常类似于 Java 的 Class(在某种程度上,Objective- C 和 Java)。

标签: objective-c


【解决方案1】:

引用Cocoa with Love

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

为了证明这一点,这里将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 指针指向自身(它是自身的一个实例)。

如需进一步了解该主题,请参阅 Greg Parker 的另一个 great explanation

【讨论】:

猜你喜欢
  • 2018-02-23
  • 1970-01-01
  • 2011-03-09
  • 1970-01-01
  • 2018-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多