RunLoop概念与响应者链

一.RunLoop简介

什么是RunLoop?

RunLoop就是运行循环,在程序运行的过程中循环做一些事情,如果没有RunLoop程序执行完毕就会立刻退出,如果有RunLoop程序会一直运行,并且时刻在等待用户的输入操作。RunLoop在有任务的时候会被唤醒,没有任务的时候会进入休眠状态,节省CPU资源,提高程序性能。

二.RunLoop的开启

当我们打开APP的时候,首先进入的是UIApplicationMain函数,RunLoop的作用是维持程序不退出,说明在UIApplicationMain函数中就启动了RunLoop,每一个进程对应一条主线程,主线程默认开启Runloop。

三.响应者链

当用户在界面发生一个点击手势事件,首先由IOKit.framwork产生一个IOHIDEvent对象,并通过mach port(轻量级的进程间通信的方式) 转发到SpringBoard.app(这个应用程序用来管理IOS的主屏幕),然后通过mach port将事情转发到前台APP进程,然后触发由APP在RunLoop注册的Source1(由Runloop和内核管理,mach port驱动)来处理事件,Source1内部调用 IOHIDEventSystemClientQueueCallBack(),IOHIDEventSystemClientQueueCallBack()内部回调了Source0(处理App内部事件,App自己负责管理(触发),如UIEvent,CFSocket)生成了UIEvent事情,并加入事情处理队列中,UIApplication从事件队列中取出事情进行派发,开始了hit-Testing的过程。

四.如何找到第一响应者?

UIApplication会首先把事件传给UIWindow,UIWindow会使用hitTest:withEvent:方法找到此次触摸事件初始点所在的视图,再到这个视图之后他会调用视图的touchesBegan:withEvent:方法来处理事件。

举个例子:

当用户点击ViewD所在的区域时会进行以下hit-Testing:

1、ViewA 的 pointInside 返回 YES,因为触摸点在其 bounds 内。遍历 ViewA 的两个 subview;

2、ViewB 的 pointInside 返回 NO,因为触摸点不在其 bounds 内,ViewB 的 hitTest 方法返回 nil。而且发生一票否决,在 ViewB 上的所有 subviews 受到牵连将不再进行 hit-Testing 处理。

3、ViewC 的 pointInside 返回 YES,因为触摸点在其 bounds 范围内,ViewC 的 hitTest 方法返回默认处理,也就是return [super hitTest:point withEvent:event];遍历 ViewC 的两个 subview。

4、ViewD的 pointInside 返回 YES,因为触摸点在其 bounds 范围内,且ViewD 没有 subview,因此 hitTest 方法返回其自己。hitTesting view 找到,结束处理。

需要注意的地方:

1、hitTest 方法调用 pointInside 方法;

2、hit-Testing 过程是从 superView 向 subView 逐级传递,也就是从层次树的根节点向叶子节点传递;

3、遇到以下设置时,view 的 pointInside 将返回NO,hitTest 方法返回 nil:

view.isHidden=YES;

view.alpha<=0.01;

view.userInterfaceEnable=NO;

control.enable=NO;(UIControl的属性)

五.事件响应

1、如果 hit-test view 或 first responder 不处理此事件,则将事件传递给其 nextResponder 处理,若有 UIViewController 对象则传递给 UIViewController,传递给其 superView。

2、如果 view 的 viewController 也不处理事件,则 viewController 将事件传递给其管理 view 的 superView。

3、视图层级结构的顶级为 UIWindow 对象,如果 window 仍不处理此事件,传递给 UIApplication.

4、若 UIApplication 对象不处理此事件,则事件被丢弃。

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