runTime runLoop

RunLoop  是事件接收和分发机制的一个实现。 

事件的传递过程是    一旦有事件发生,第一个接收这个事件的对象是window,判断window是否能处理,能处理遍历他的子控件看能不能处理,子控件能处理又遍历子控件的子控件,知道它的子控件不能处理时,事件就由它处理。      runloop提供异步执行代码机制,不能并行处理任务。

在主队列中,Main RunLoop直接配合任务的执行,负责处理UI事件、定时器以及其他内核相关的事件。

runloop特点:保证程序执行的县城不会被系统终止

何时调用:当需要和该线程进行交互的时候是才会使用runLoop,每个线程都有其对应的RunLoop,默认非主线程的runLoop是没有运行的,需要一个事件源,然后去run它。

当线程中需要长时间检测一个事件时,才启用线程的runLOOP,runloop使用之后如果检测到该事件,就执行该事件,如果没有,该线程会一直不退出。runLoop体现出,有事件就干活,没事就小憩,但是不离开(不退出线程)

runloop是线程进入、被线程拿来处理相应事件以及调用事件处理函数的地方。需要和while 或者for循环来驱动runloop  

在循环中我们创建一个runloop对象来启用runloop,这个对象就是该线程中的runloop

dispatch_queue_t   serialQueue = dispatch_queue_create("serialQueue",DISPATCH_QUEUE_SERIAL);创建线程队列

dispatch_async(serialQueue,^{ 

NSRunloop  runloop = [NSRunloop currentRunloop];获得当前线程中的runloop

需要添加列子

    });block就是线程

runloop有两种源事件     input sources  和timer  sources  

input sources 传递异步事件

timer sources 处理定时器事件  传递同步事件 

runloop产生关于本身行为的notification。注册成为Runloop的observer,可以接收notification。

runloop工作模式有 事件源处理事件,没有进入休眠,该事件源再次出现,就唤醒runloop处理事件,一直这么循环。简单的说就是有事就做,没事休眠。



runtime

runtime简称运行时。系统运行时的机制,主要就是消息机制。

c语言,函数的调用在编译的时候会决定调用那个函数,调用完成之后按顺序执行,无任何二义性。

oc语言,函数的调用成为消息的发送属于动态调用过程。在编译时并不能决定真正调用那个函数(在编译时oc可以调用任何函数,即使这个函数没有实现,有申明不会报错,c中就会报错)只有在真正运行时才会根据函数名称找对应函数来调用。

[obj makeText]发送makeText这个消息在编译时代码变成objc_msgSend(obj,@selector(makeText));

在objc_msgSend函数中,执行流程:

通过obj的isa指针找到obj对应的class;在class先去cache中通过SEL查找对应函数method,没有去methodList中查找,有把method加入到cache中(方便下次使用),通过method中的函数指针跳转到对应的函数中执行


ios中的obj都是继承NSObject。

查看NSObject

@interface NSObject、{
  Class isa OBJC_ISA_AVAILABILITY;

}

在NSObject中存在一个Class的isa指针

查看Class

typedef struct objc_class *Class;

struct objc_class{
 

Class  isa;                                指向metaclass

Class super_class;                   指向其父类

const  char  char *name;          类名

long version;                             类的版本信息  初始化默认为0,通过runtime函数

class_setVersion ;                     修改 

class_getVersion;                      读取

long info;                                    一些标识信息CLS_CLASS(o*1L)普通类class包含对象方法和成员变量                                                                          CLS_META(0*2L)该类为 metaclass  包含类方法

long instance_size;                    该类的实例变量大小(父类继承)

struct objc_ivar_list *ivars;                        存储每个成员变量的地址

struct objc_method_list **methodLists      标识信息CLS_CLASS(o*1L)存储对象方法   CLS_META(0*2L)存储类方法

struct objc_cache *cache                         指向最近使用方法的指针,用于提升效率

struct objc_protocol_list *protocols           存储该类遵守的协议

}

runTime runLoop

         isa          ->                普通class(-)          ->           静态class(+)