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指针又指向自己。
网友评论