基础总结(runtime/runloop)

1.runtime介绍(https://www.jianshu.com/p/ea2d0a6fa8d6)

OC是一门动态语言,所以它总想办法把一些决定工作从编译推迟到运行时。也就是说只有编译器是不够的,它还需要一个运行时系统来执行编译后的代码。这就是Runtime系统存在的意义,它是整个OC的一个基石。

Runtime基本是用C和汇编语言写的,可见苹果为动态系统的高效做出的努力。

Runtime库主要做下面几件事:

封装:在这个库中,对象可以用C语言中的结构体表示,而方法可以用C函数来实现,另外再加上了一些额外的特性。这些结构体和函数被runtime函数封装后,我们就可以在程序运行时创建,检查,修改类、对象和它们的方法了。

runtime核心是消息传递;

1. 消息发送流程

   确定调用方法的类是否加载完毕

   调用objc_msgSend方法,给调用对象发送消息

   对象在方法缓存列表(cache)中查询是否有对应方法,有直接调用

   没有的话在对象方法列表中查找->父类->>>nsobject 没找到进入消息动态解析

2. 消息动态解析

   接收消息对象未找到对应的实现方法,调用solverStanceMethod或者solverClassMethod 看是否进行方法动态创建方法 创建了就直接使用再次进入消息发送流程没有就进入消息转发

接收消息对象未找到对应的实现方法,调用solverStanceMethod后者solverClassMethod看是否进行方法动态创建方法 创建了就直接使用再次进入

3. 消息转发

   快速转发:forwardingTargertSelector方法进行方法执行对象重定向这个快速转发方法,没有处理就进入完整消息转发 调用methodSignatureForSelector获得函数的参数和返回值类型 创建nsinvocation(求助对象)  发送forwardingInvocation消息给目标对象 没获取到函数信息  就会发出 donsNotrecognizeselector消息 崩溃

应用

1.    动态方法交换 method  swizzling

        通过 class_getClassMethod()/Class_getInStanceMethod()方法,获取方法实现地址,通过method_exhangeImplementtations()方法交换两个方法

       方法的置换在类的 +load方法中调用

       拦截并替换系统方法

2.    分类添加新属性 

借助runtime的关联对象特性,帮助我们在运行阶段任意属性关联到一个对象上,实现属性一样的效果;

      例子:  nsdate分类的year/month/day/hour等

3.    获取类的详细信息

包裹属性列表/成员变量/方法/协议等

 4. 动态添加方法和修改属性变量的值

 5. 归档和解档  字典和模型的转换(KVC)

6.    KVO实现原理

利用Runtime生成一个中间对象,让原对象的isa指针指向它,然后重写 setter方法,插入willChangeValueForKey和didChangeValueForKey方 法。 当属 性变化时会调用,会调用这两个方法通知到外界属性变化。


runloop

它是一个处理事件的循环(线程进入这个循环,运行事件处理程序来响应传入的事件),RunLoop的目的是当有事件需要处理时,线程是活跃的、忙碌的,当没有事件后,线程进入休眠

Runloop Mode实际上是 Source,Timer 和 Observer 的集合,不同的 Mode 把不同组的Source,Timer和Observer隔绝开来.Runloop 在某个时刻只能跑在一个 Mode 下,处理这一个 Mode 当中的 Source,Timer 和 Observer

基本作用

1、保持程序的持续运行

2、处理App中的各种事件(比如触摸事件、定时器事件等)

3、节省CPU资源,提高程序性能:该做事时做事,该休息时休息

应用范畴

1、定时器(Timer)、PerformSelector

2、GCD Async Main Queue

3、事件响应、手势识别、界面刷新

4、网络请求

5、AutoreleasePool

runloop与线程之间的关系

1、每条线程都有唯一的一个与之对应的RunLoop对象

2、RunLoop保存在一个全局的Dictionary里,线程作为key,RunLoop作为value

3、线程刚创建时并没有RunLoop对象,RunLoop会在第一次获取它时创建([NSRunLoop currentRunLoop])

4、RunLoop会在线程结束时销毁

5、主线程的RunLoop已经自动获取(创建),子线程默认没有开启RunLoop

runloop内部实现逻辑

第一步:首先通知Observers进入Loop 然后处理一些 定时器、事件、block

第二步:事件处理完成之后通知Observers进入休眠状态开始休眠 等待消息唤醒

第三步:通知Observers结束休眠处理一些 定时器、事件、block

autoreleasePool 在何时被释放

App启动后,苹果在主线程 RunLoop 里注册了两个 Observer,其回调都是 _wrapRunLoopWithAutoreleasePoolHandler()

第一个 Observer 监视的事件是 Entry(即将进入Loop),其回调内会调用 _objc_autoreleasePoolPush() 创建自动释放池,优先级最高,保证创建释放池发生在其他所有回调之前

第二个 Observer 监视了两个事件: BeforeWaiting(准备进入休眠) 时调用_objc_autoreleasePoolPop() 和 _objc_autoreleasePoolPush() 释放旧的池并创建新池;Exit(即将退出Loop) 时调用 _objc_autoreleasePoolPop() 来释放自动释放池,优先级最低,保证其释放池子发生在其他所有回调之后

在主线程执行的代码,通常是写在诸如事件回调、Timer回调内的。这些回调会被 RunLoop 创建好的 AutoreleasePool 环绕着,所以不会出现内存泄漏,开发者也不必显示创建 Pool 了

PerformSelector 的实现原理

当调用NSObject的performSelecter:afterDelay:后,实际上其内部会创建一个Timer并添加到当前线程的RunLoop中,所以如果当前线程没有RunLoop,则这个方法会失效

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,755评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,369评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,799评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,910评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,096评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,159评论 3 411
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,917评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,360评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,673评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,814评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,509评论 4 334
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,156评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,882评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,123评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,641评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,728评论 2 351

推荐阅读更多精彩内容