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 存储该类遵守的协议
}
isa -> 普通class(-) -> 静态class(+)