Objective c 在Cocoa中,类类型是如何定义的?

Objective c 在Cocoa中,类类型是如何定义的?,objective-c,macos,cocoa,Objective C,Macos,Cocoa,从“objc.h”开始: 但在“runtime.h”中: 什么是类 typedef struct objc_class *Class; ^这是一个objc_类指针的前向声明。它给了它一个友好的名字Class 现在让我们看一下objc_类struct: (删除Objective-C 2.0检查以缩短时间) 现在我们有了一个指向自己类型的结构。但你为什么要问 取自 类“isa”(类“Class”)指向的类包含 类在其objc_方法_列表中的类方法。明白了吗?这个 运行时中使用的术语是,当对象的is

从“objc.h”开始:

但在“runtime.h”中:

什么是

typedef struct objc_class *Class;
^这是一个
objc_类
指针的前向声明。它给了它一个友好的名字
Class

现在让我们看一下
objc_类
struct: (删除Objective-C 2.0检查以缩短时间)

现在我们有了一个指向自己类型的结构。但你为什么要问

取自

类“isa”(类“Class”)指向的类包含 类在其objc_方法_列表中的类方法。明白了吗?这个 运行时中使用的术语是,当对象的isa指向 对于它的类,类的isa指向对象的“元类”

那么,一个元类的isa指针呢?好吧,这就指向了根源 层次结构的类(大多数情况下为NSObject)。(基金会) 框架NSObject“isa”实例子类的每个元类 是的,顺便说一句,NSObject的元类“isa”指向后面 对于同一个结构,它是一个循环引用,因此没有类'isa'是 永远无效


因此,根据该描述,当您创建一个继承自
NSObject
的类时,您有一个
isa
,它指向其类类型,它指向它的元类,它指向它的根类(
NSObject
),它包含对自身的循环引用。这就解释了它的原因

假设您创建了以下类:

@interface MyClass : NSObject
@end
@implementation MyClass
@end

如果您能够*遍历isa指针,您将得到以下结果:
*由于
isa
受到保护,因此不能执行此操作。请参阅下面的Cocoa with Love帖子,了解如何创建自己的实现


一旦
c==c->isa
您就知道您位于根对象。请记住,Objective-C是C的一个适当超集,它本身并不具有诸如继承之类的面向对象的构造。这与其他实现细节(如指向构成完整类层次结构的超类的指针)一起,允许Objective-C提供面向对象的特性。有关类和元类的更多信息,请参阅Cocoa with Love的帖子:

关于循环引用:

如果isa不是如下定义的指针,那么它将成为循环引用

struct objc_class {
    struct objc_class isa;
}; 
因为编译器无法计算objc_类的大小

但是,在以下情况下(真实定义)


isa只是一个指针,所以没有问题。

类型定义表明它是指向
struct objc_类
的指针,不是吗?@dasblinkenlight他可能对
struct objc_类
的成员感到困惑。是的,我很困惑-请你向我解释一下它到底是什么?因为我认为这是两个标题之间的循环引用。回答不错,但有一点。。。如果OP的代码是正确的,那么“删除Objective-C2.0检查以缩短它”将删除整个定义-请注意
struct本身上的最终
OBJC2\u不可用
。是的,它是正确的,并且您根本不应该使用
objc\u类
struct。每个类都必须有一个
isa
作为其第一个成员,所以我只是添加了一个简短的struct版本作为示例。其余的细节都是在
OBJC2
中定义的实现。回答得好!非常感谢。
struct objc_class {
    Class isa;
};
//This is really saying
struct objc_class {
    struct objc_class *isa;
};
@interface MyClass : NSObject
@end
@implementation MyClass
@end
Class c = myClassInstance->isa; //This would be the MyClass
c = c->isa; //This would be MyClass' meta class
c = c->isa; //This would be NSObjects meta class
c = c->isa; //This going forward would still be the NSObjects meta class
...
struct objc_class {
    struct objc_class isa;
}; 
struct objc_class {
    struct objc_class *isa;
};