iOS——Runtime学习(1)
动态语言和静态语言
了解Runtime,首先要知道动态语言和静态语言的区别:
静态类型语言,是指数据类型的检查以及函数的调用是在运行前(如编译阶段)做的。如C语言,编译阶段就要决定调用哪个函数,如果函数未实现就会编译报错。
动态类型语言,是指数据类型的检查和函数的调用是在运行时做的。运行时新的函数可以被引进,已有的函数可以被删除。
OC就是一门动态语言,主要就体现在编译后程序运行时,我们还可以对一个类做添加属性、添加方法,可以将一个普通的类改的五花八门,而这一切,都通过runtime来实现。
Runtime介绍
Objective-C 扩展了 C 语言,并加入了面向对象特性和 Smalltalk 式的消息传递机制。而这个扩展的核心是一个用 C 和 编译语言 写的 Runtime 库。它是 Objective-C 面向对象和动态机制的基石。
oc的对象方法调用就是[obj func],是我们非常熟悉的。而每次对象调用方法其实是这么一个过程:
- [obj func]被编译器转成消息发送:不带参数的方法被编译为:objc_msgSend(receiver,selector);带参数的方法被编译为:objc_msgSend(recevier,selector,org1,org2,…)
- 通过obj的isa指针找到它的 class ;
- 在 class 的 method list 找 func ;
- 如果 class 中没到 func,继续往它的 superclass 中找 ;
- 一旦找到 func 这个函数,就去执行它的实现IMP 。
说明:对象调用方法[obj func]时,编译阶段确定了要向哪个接收者发送message消息,但是接收者如何响应决定于运行时的判断。
类对象的理解
我对于类对象的理解就是:类也是一个对象。
通过runtime的API文件可以看到,struct objc_class和struct objc_object两个结构体中都有isa指针,很容易可以理解到objc_object的指针是指向对象的定义。而objc_class中也有一个isa指针,那就可以理解类为什么也是一个对象了,objc_class的isa指针指向的也是一个类,这个类称为元类,所以类又可以称为类对象。
每个类只有一个类对象,同时也只有一个元类,元类的isa指针指向自己