Objective-C是一门动态语言,为什么是动态语言,是因为Objective-C除了有自己的编译器外,他还有一套系统来进行动态的创建类和对象以及消息的发送、传递,这套系统就是:runtime。
首先,objc(以下Objective-C都用objc代替,我觉得大家也都懂的)虽然是Apple的程序的核心语言,Apple自己也是一个封闭的系统,但是objc本身是一套开源的语言,想看他的源代码,地址是:
我看的是objc4-647.tar.gz版本,接下来,我来说说自己对于runtime的理解。
消息传递
我是做iOS开发的,我们最常见到的方法调用就是下面这样的:
[aFunc foo]; //aFunc为某类的一实例化对象,foo为该类中的一个方法。
这是一个很常见的方法调用的例子,但与静态语言不同,使用这句方法时,编译器会把这句代码转化另外一句纯C语言的方法,在message.h
中有如下定义:
id objc_msgSend(id self, SEL op, ...);
根据这句方法,我们开始我们的runtime理解。
首先,什么是id,在objc.h
中有如下定义:
/// A pointer to an instance of a class.
typedef struct objc_object *id;
可以看得出,id是一个指向objc_object
结构体的指针,那么objc_object
是怎样的?在objc.h
中有如下定义:
/// Represents an instance of a class.
struct objc_object {
Class isa OBJC_ISA_AVAILABILITY;
};
可以看出,这个结构体中主要就是一个Class isa的成员,这个成员指向了所属的类。那么Class是怎么定义的呢?在objc.h
中有如下定义:
/// An opaque type that represents an Objective-C class.
typedef struct objc_class *Class;
这样就很明显了,Class是一个指向objc_class
结构体的指针,那么就到objc_class
了,这是在runtime.h
中的定义:
struct objc_class {
Class isa OBJC_ISA_AVAILABILITY;
#if !__OBJC2__
Class super_class OBJC2_UNAVAILABLE;
const char *name OBJC2_UNAVAILABLE;
long version OBJC2_UNAVAILABLE;
long info OBJC2_UNAVAILABLE;
long instance_size OBJC2_UNAVAILABLE;
struct objc_ivar_list *ivars OBJC2_UNAVAILABLE;
struct objc_method_list **methodLists OBJC2_UNAVAILABLE;
struct objc_cache *cache OBJC2_UNAVAILABLE;
struct objc_protocol_list *protocols OBJC2_UNAVAILABLE;
#endif
}OBJC2_UNAVAILABLE;
通过OBJC2_UNAVAILABLE
可以看得出,objc2中这套定义已经不用了,我们先不说objc2中是怎样的,我们先通过这套定义来管中窥豹。
isa是一个Class对象的Class,即:Meta Class。面向对象中,Class本身也是一个对象,因为在objc-runtime-new.h
中有如下定义:
struct objc_class : objc_object {
// Class ISA;
Class superclass;
cache_t cache; // formerly cache pointer and vtable
class_data_bits_t bits; // class_rw_t * plus custom rr/alloc flags
...
这里的objc_class
也是继承于objc_object
,所以,Class在设计上也是一个对象。
接下来的我闲了继续写,开了好几个坑了。。。