iOS

runtime OC类执行顺序

Runtime,了解一下?

Posted by Japho on August 23, 2016

runtime如何实现?

OC这个语言尽可能的将一些决定从编译器推迟到运行时,他会尽可能的动态处理事情,这意味着这个语言不仅需要一个编译器,还需要一个运行时系统,使得这个语言得以运行。 RunTime简称运行时。就是系统在运行的时候的一些机制,其中最主要的是消息机制。对于C语言,函数的调用在编译的时候会决定调用哪个函数( C语言的函数调用请看这里 )。编译完成之后直接顺序执行,无任何二义性。OC的函数调用成为消息发送。属于动态调用过程。在编译的时候并不能决定真正调用哪个函数(事实证明,在编 译阶段,OC可以调用任何函数,即使这个函数并未实现,只要申明过就不会报错。而C语言在编译阶段就会报错)。只有在真正运行的时候才会根据函数的名称找 到对应的函数来调用。

Runloop

一般来讲,一个线程一次只能执行一个任务,执行完成后线程就会退出。runloop就是一种机制,让线程能随时处理事件但并不退出, 一个run loop就是一个事件处理循环,用来不停的监听和处理输入事件并将其分配到对应的目标上进行处理。相对于普通循环,NSRunLoop是一种更加高明的消息处理模式,他对消息处理过程进行了更好的抽象和封装,把消息打包成input source或者是timer source。 其次,也是很重要的一点,使用runloop可以使你的线程在有工作的时候工作,没有工作的时候休眠,这可以大大节省系统资源。

OC类怎么执行?

  1. 当程序启动时,就会加载项目中所有的类,而且加载后会调用每个类的+load方法,只会调用一次;
  2. 当第一次使用某个类时,就会调用当前类的+initialize方法;
  3. 先加载父类,再加载子类(先调用父类的+load方法,再调用子类的+load方法,最后调用分类的+load方法),先初始化父类,再初始化子类(先调用父类的+initialize方法,再调用子类的+initialize方法)。
  4. 注意:在初始化的时候,如果在分类中重写了+initialize方法,则会覆盖掉父类的。
  5. 重写+initialize方法可以监听类的使用情况。

首先从硬盘load程序代码到内存。 其次操作系统找到程序入口开始执行。

再次在程序执行过程中进行内存的管理。主要需要四部分内存空间:堆区用来存放创建的对象;栈区用来存放局部变量;数据区用来存放静态变量和字符串常量;代码区用来存放程序代码。