1.Runtime是什么
Objective-C语言是一门动态语言,它将很多静态语言在编译和链接时期做的事放到了运行时来处理。这种动态语言的优势在于:我们写代码时能够更具灵活性,如我们可以把消息转发给我们想要的对象,或者随意交换一个方法的实现等。(摘自:http://www.cocoachina.com/ios/20141031/10105.html)
Objective-C(下面简称OC)是对C语言的封装,Runtime是OC在封装C时的一个产物。Runtime简单说就是一套C语言API,OC的所有代码在编译时最终会转化成直接执行Runtime中API的代码。
当我们在OC中调用一个方法如:
[obj dosomething];
会被转化为Runtime中的可执行的的方法
objc_msgSend(obj, @selector (dosomething));
2.元类
元类是类对象的类。听起来很拗口。
我们知道,一个类可以定义一个实例对象。举例
ClassObject *instanceObject = [[ClassObject alloc] init];
此处ClassObject就是一个类,instanceObject就是一个实例对象。
而在OC中,每当我们创建一个类,在编译时就会创建一个元类,而这个元类的对象就是我们创建的这个类。
3.isa指针
我们知道OC是基于C语言的,所有OC语法最后Runtime转化成可被Runtime执行的C代码。在OC中定义一个创建NSObject类,转化成C语言后,其表现是创建了一个结构体。可以在Xcode中点击alt+NSObject查看该结构。
NSObject转化成C后的样子
其中isa就是这个结构中的一个指针。这个指针指向他的类。如果是实例对象,则指向类,如果是类,则isa指类的类,也就是元类(meta class)。而元类则指向另一个基类的元类。
我们创建一个实例对象,在C中
struct objc_object {
Class isa OBJC_ISA_AVAILABILITY;
};
此处的isa指针指向其类地址。下图说明了元类,类及对象的isa指向
对象,类,元类关系图
4.关系
讲了Runtime,isa,元类等概念最终是为了说明白一个OC的方法,是最终如何通过runtime执行的。如下
Person:NSObject{
+(void)eat;
-(void)make;
}
[Person eat];
Person *onePerson = [[Person alloc] init];
此时有结构如下图
Person关系图
Person执行eat方法,runtime将其转化为OC函数
objc_msgSend(Person, @selector (makeText))
首先会从Person结构中寻找,如果Person结构的方法列表中寻找eat,有则执行,否则则会根据isa地址去去Person元类中寻找。如果Person元类中没有则根据isa再去基元类中找。此处eat方法在person元类中,make方法在Person中。即类方法在元类的方法列表中,对象方法在类方法列表中。
网友评论