美文网首页
Runloop源码解析

Runloop源码解析

作者: 招牌猪 | 来源:发表于2017-09-15 00:15 被阅读10次

1.主要的逻辑:

while(传过来的参数model参数  ){

     while(model){

     handleRunloopStaus();//runloop的状态处理,是否stop

     confidencegPort();//用于配制prot通信

     timeRunloopTimeoutResume();//启动超时定时器,一般都不会超时,runloop设置超时          

       的时间很大。

      runloopDoObservers();  //处理监听状态

      runloopDoSourese();//处理Sources

      if(msg){

             goto;handle_msg;  //处理消息(系统)

         } 

      wait();等待消息

     if(msg){

            goto;handle_msg;  //处理消息(系统)

       }else{

             __CFRunloopDoSourse();//处理sours

         }

}

model --- 这里的model指的是runloop的两种模式kCFRunLoopDefaultMode和UITrackingRunLoopMode,第一个model的模式APP的默认Model,通常主线程是在这个Model下运行,而界面跟踪Model,用于Scrollview追踪触摸滑动,保证界面滑动时不受其他Model影响。

重点在于:runloop会通知监听者,需要处理事情了,包括他的时间与对象,然后利用block回掉,等待处理结果sourese为0,如果发现其他事情还需要处理,继续处理,如果没有告知监听者,runloop准备休息,睡觉。

2.自动释放池在什么时候会启动

自动释放池在Runloop发送通知的时候,就会自动的启动。

3.在什么情况下使用Runloop

// NSTimer defalultModel // tableview 在滑动的时候,不会被触发

// 常驻线程 runloop

// 自己创建线程, 处理一些延时操作,也需要用runloop

// 休眠的状态能监听到,利用这个状态处理事情

4.线程与NSRunloop的关系

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

主线程的RunLoop已经自动创建好了,子线程的RunLoop需要主动创建。

RunLoop在第一次获取时创建,在线程结束时销毁。

其实在创建线程的时候,并不是就创建了一个Runloop,需要自己去开启一个Runloop,需要调用这个方法:[[NSRunLoop currentRunLoop] run];// 开启一个Runloop与线程相对应,具体的源码:

// 如果__CFRunLoops 这个字典为nil,生成一个

if (!__CFRunLoops) {

__CFUnlock(&loopsLock);

CFMutableDictionaryRef dict = CFDictionaryCreateMutable(kCFAllocatorSystemDefault, 0, NULL, &kCFTypeDictionaryValueCallBacks);

CFRunLoopRef mainLoop = __CFRunLoopCreate(pthread_main_thread_np());

// main线程和他的runloop关系对应起来 key是线程,value是runloop

CFDictionarySetValue(dict, pthreadPointer(pthread_main_thread_np()), mainLoop);

if (!OSAtomicCompareAndSwapPtrBarrier(NULL, dict, (void * volatile *)&__CFRunLoops)) {

CFRelease(dict);

}

CFRelease(mainLoop);

__CFLock(&loopsLock);

}

// 根据线程 获取runloop

CFRunLoopRef loop = (CFRunLoopRef)CFDictionaryGetValue(__CFRunLoops, pthreadPointer(t));

__CFUnlock(&loopsLock);

// runloop 为空

if (!loop) {

// 创建了一个runloop

CFRunLoopRef newLoop = __CFRunLoopCreate(t);

__CFLock(&loopsLock);

// 再次获取一次

loop = (CFRunLoopRef)CFDictionaryGetValue(__CFRunLoops, pthreadPointer(t));

if (!loop) {

// 关联起来

CFDictionarySetValue(__CFRunLoops, pthreadPointer(t), newLoop);

loop = newLoop;

}

// don't release run loops inside the loopsLock, because CFRunLoopDeallocate may end up taking it

__CFUnlock(&loopsLock);

CFRelease(newLoop);

}

相关文章

  • 记录一些介绍Runloop的牛文

    老司机出品——源码解析之RunLoop详解深入理解RunLoop关于RunLoop部分源码的注释CFRunLoop...

  • 底层原理探究(二)RunLoop

    转自: 老司机出品——源码解析之RunLoop详解入门使用: RunLoop入门 看我就够了孙源的Runloop视...

  • RunLoop源码解析

    一直计划着读读RunLoop的源码,可是一直没有行动,刚好这个周末没啥事,就看看RunLoop的源码吧。版本: C...

  • Runloop源码解析

    1.主要的逻辑: while(传过来的参数model参数 ){ while(model){ handleR...

  • RunLoop 源码解析

    苹果对runloop的使用 苹果在AutoreleasePool、手势识别、事件响应、UI更新、定时器、NSObj...

  • RunLoop:源码解析

    源码解析 调用顺序CFRunLoopRun -> CFRunLoopRunSpecific -> __CFRunL...

  • 学习RunLoop

    runloop源码地址:源码下载 runloop官方介绍:查看文档 runloop的源码在corefundatio...

  • RunLoop源码解析(一)

    CFRuntimeClass动态创建一个类所需要的信息 _CFRuntimeRegisterClass动态注册一个...

  • RunLoop回顾&&源码解析

    RunLoop是什么 RunLoop是事件接收和分发机制的一个实现,是系统中和线程相关的基础框架的组成部分;一个R...

  • RunLoop学习资料

    非常好的runloop学习系列 CoreFoundation源码 RunLoop系列之源码分析 关于Runloop...

网友评论

      本文标题:Runloop源码解析

      本文链接:https://www.haomeiwen.com/subject/orijsxtx.html