码迷,mamicode.com
首页 > 其他好文 > 详细

2016 - 1 - 20 runloop学习

时间:2016-01-20 22:33:55      阅读:207      评论:0      收藏:0      [点我收藏+]

标签:

一:Runloop基本知识

1.本质就是运行循环

2.基本作用:

  2.1保证程序持续运行

  2.2处理APP中的各种事件:触摸,定时器,selector...

  2.3节省CPU资源,系统程序性能:它会让主线程在工作时工作,非工作时休息。

  2.4....

二:main函数中的Runloop

  1.

1 int main(int argc, char * argv[]) {
2     @autoreleasepool {
3         return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
4     }
5 }

   2.第三行中的UIApplicationMain函数内部就启动了一个Runloop.

也就说,UIApplicationMain函数一直没有返回,保证了程序的持续运行。

   3.这个启动的Runloop启动后默认是和主线程相关联的。

三:Runloop对象:

iOS中有两套API来冯访问Runloop对象

  1.Foundation(ObjC) ----- NSRunloop

  NSRunloop 其实就是 CFRunloopRef基于OC的包装对象。

 

  2.Core Foundation -------CFRunloopRef

四:Runloop与线程

  1.每一个线程都有唯一一个RunLoop对象

  2.主线程的RunLoop是创建好的,子线程的需要主动创建

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

五:获得RunLoop对象

  1.RunLoop对象都是采用懒加载的模式来创建的,即获取时才会创建

  2.Foundation框架中的NSRunLoop对象创建:

    
    [NSRunLoop mainRunLoop];  //获得主线程的RunLoop对象。
    
    [NSRunLoop currentRunLoop];// 获得当前线程的RunLoop对象,需要注意的是,如果新开辟了线程而没有调用此方法时,当前子线程的RunLoop对象是没有被创建的。

  3.Core Foundation框架中的CFRunLoopRef对象创建:

    CFRunLoopGetCurrent();// 获得当前线程的RunLoop对象。
    
    CFRunLoopGetMain();  // 获得主线程的RunLoop对象。

  4.可以在苹果官方的源码中看出,RunLoop与对应的线程是存在字典中的,key就是对应的线程。

六:RunLoop相关类

  1.Core Foundation中关于RunLoop的五个类

  1.1CFRunLoopRef

  1.2CFRunLoopModeRef

  1.3CFRunLoopSourceRef

  1.4CFRunLoopTimerRef

  1.5CFRunLoopObserverRef

  2.关系如图:技术分享

  需要注意的是,如果RunLoop中没有这些类,它将直接被销毁。

 

2016 - 1 - 20 runloop学习

标签:

原文地址:http://www.cnblogs.com/BJTUzhengli/p/5146739.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!