- 1、本文档共19页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
多线程
RunLoop文顶顶
什么是RunLoop从字面意思看运行循环跑圈基本作用保持程序的持续运行处理App中的各种事件(比如触摸事件、定时器事件、Selector事件)节省CPU资源,提高程序性能:该做事时做事,该休息时休息......
如果没有RunLoopintmain(intargc,char*argv[]){NSLog(@executemainfunction);return0;}程序开始程序结束没有RunLoop的情况下第3行后程序就结束了
如果有了RunLoopintmain(intargc,char*argv[]){BOOLrunning=YES;do{//执行各种任务,处理各种事件//......}while(running);return0;}程序开始持续运行有RunLoop的情况下由于main函数里面启动了个RunLoop,所以程序并不会马上退出,保持持续运行状态
main函数中的RunLoop第14行代码的UIApplicationMain函数内部就启动了一个RunLoop所以UIApplicationMain函数一直没有返回,保持了程序的持续运行这个默认启动的RunLoop是跟主线程相关联的
RunLoop对象iOS中有2套API来访问和使用RunLoopFoundationNSRunLoopCoreFoundationCFRunLoopRefNSRunLoop和CFRunLoopRef都代表着RunLoop对象NSRunLoop是基于CFRunLoopRef的一层OC包装,所以要了解RunLoop内部结构,需要多研究CFRunLoopRef层面的API(CoreFoundation层面)
RunLoop资料苹果官方文档CFRunLoopRef是开源的
RunLoop与线程每条线程都有唯一的一个与之对应的RunLoop对象主线程的RunLoop已经自动创建好了,子线程的RunLoop需要主动创建RunLoop在第一次获取时创建,在线程结束时销毁
获得RunLoop对象Foundation[NSRunLoopcurrentRunLoop];//获得当前线程的RunLoop对象[NSRunLoopmainRunLoop];//获得主线程的RunLoop对象CoreFoundationCFRunLoopGetCurrent();//获得当前线程的RunLoop对象CFRunLoopGetMain();//获得主线程的RunLoop对象
RunLoop相关类CoreFoundation中关于RunLoop的5个类CFRunLoopRefCFRunLoopModeRefCFRunLoopSourceRefCFRunLoopTimerRefCFRunLoopObserverRef
CFRunLoopModeRefCFRunLoopModeRef代表RunLoop的运行模式一个RunLoop包含若干个Mode,每个Mode又包含若干个Source/Timer/Observer每次RunLoop启动时,只能指定其中一个Mode,这个Mode被称作CurrentMode如果需要切换Mode,只能退出Loop,再重新指定一个Mode进入这样做主要是为了分隔开不同组的Source/Timer/Observer,让其互不影响
CFRunLoopModeRef系统默认注册了5个Mode:kCFRunLoopDefaultMode:App的默认Mode,通常主线程是在这个Mode下运行UITrackingRunLoopMode:界面跟踪Mode,用于ScrollView追踪触摸滑动,保证界面滑动时不受其他Mode影响UIInitializationRunLoopMode:在刚启动App时第进入的第一个Mode,启动完成后就不再使用GSEventReceiveRunLoopMode:接受系统事件的内部Mode,通常用不到kCFRunLoopCommonModes:这是一个占位用的Mode,不是一种真正的Mode
CFRunLoopSourceRefCFRunLoopSourceRef是事件源(输入源)以前的分法Port-BasedSourcesCustomInputSourcesCocoaPerformSelectorSources现在的分法Source0:非基于Port的Source1:基于Port的
CFRunLoopTimerRefCFRunLoopTimerRef是基于时间的触发器基本上说的就是NSTime
文档评论(0)