Class与MetaClass

Objective-c是C的超集,提供了面向对象的机制,而面向对象思想里面有两个重要的概念类和实例。那么Objective-C里类的结构是怎样的呢?以下整理总结:

首先有几个概念:

id

在objc.h中我们可以看到id的定义

/// A pointer to an instance of a class

typedef struct objc_object *id;

正如注释中说,id是指向一个objc_object的指针。那objc_object又是什么呢?

objc_object

在objc.h中我们也能看到如下定义

/// Represents an instance of a class.

struct objc_object {

Class isa OBJC_ISA_AVAILABILITY;

};

于是我们知道objc_object会被转换成C的结构体,而在这个struct中有一个isa指针,指向它的类别Class。

Class

再往下看Class的定义:

/// An opaque type that represents an Objective-C class.

typedef struct objc_class *Class;

发现Class本身指向的也是一个C的struct objc_class。

Objc_Class

在runtime.h中我们看到如下定义:

struct objc_class {

Class isa OBJC_ISA_AVAILABILITY;

# !__OBJC2_

Class super_class

const char *name

long version

long info

long instance_size

struct objc_ivar_list *ivars

struct objc_method_list **methodLists

struct objc_cache *cache

struct objc_protocol_list *protocols

#endif

} OBJC2_UNAVAILABLE;

MetaClass

我们发现Class本身也有一个isa指针,指向的是它的MetaClass。

*当我们对一个实例发送消息时(-开头的方法),会在该instance对应的类的methodLists里查找。

*当我们对一个类发送消息时(+开头的方法),会在该类的MetaClass的methodLists里查找。

这一过程如下图所示:


*每个class都有一个isa指针指向一个唯一的Meta Class

*每一个Meta Class的isa指针都指向最上层的Meta Class,即NSObject的MetaClass,而最上层的MetaClass的isa指针又指向自己。

iOS runtime之消息转发

深入理解 Objective-C 的方法调用流程

iOS runtime 之 Category

Objective-C 深入理解 +load 和 +initialize

你可能感兴趣的:(Class与MetaClass)