zoukankan      html  css  js  c++  java
  • RunRunLoop初识

    一.RunLoop 顾名思义就是一个循环,你的线程在这里开始,并运行事件处理响应输入事件.
    RunLoop的作用:
    1.保证程序的持续运行
    2.处理App中的各种事件,(比如触摸,定时器事件,Selector事件)
    3.节约CPU资源,提高程序性能,该做事情的时候做事情,该休息的时候就休息
     
    RunLoop在iOS中有二套API
    Foundation NSRunLoop
     
    *Core Foundation 大部分东西都是C语言的
    NSRunLoop 封装了CFRunLoop
     
    二.简单介绍RunLoop与线程的关系:
    每个线程都有一个与之对应的RunLoop,主线程的RunLoop在程序中是自动创建的,子线程则需要我们自己手动进行创建
     
    三.获取RunLoop(准确的说,是获取当前线程的RunLoop)
    [NSRunLoop currentRunLoop];
     获取主线程的RunLoop;
    [NSRunLoop mainRunLoop];
    子线程的RunLoop(这是我们自己手动创建的)默认情况下NSTimer被加入NSDefaultRunLoopMode;
    如果想要NSTimer收到组件或者动画影响就添加到NSRunLoopCommonModes:
     NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(threadAction) object:nil];
        [thread start];
    四.Mode RunLoop的运行模式
    注意:RunLoop是有多种模式的,但是一个RunLoop只能选择一种模式运行,如果想要切换模式,需要退出当前模式.
    kCFRunLoopDefaultMode 默认模式 主线程默认模式
    UITrackingRunLoopMode 页面跟踪模式
    kCFRunLoopCommonModes 占位模式(包含上面二种情况,若把事件添加到此模式下,事件在上面二种模式都可以响应).
     
    五.CFRunLoopObserverRef 是观察者 监听RunLoop的状态
         typedef CF_OPTIONS(CFOptionFlags, CFRunLoopActivity) {
         kCFRunLoopEntry = (1UL << 0),  即将进入RunLoop
         kCFRunLoopBeforeTimers = (1UL << 1),
         kCFRunLoopBeforeSources = (1UL << 2),
         kCFRunLoopBeforeWaiting = (1UL << 5), 休眠之前
         kCFRunLoopAfterWaiting = (1UL << 6),
         kCFRunLoopExit = (1UL << 7),
         kCFRunLoopAllActivities = 0x0FFFFFFFU
         };
     
         创建observer
        CFRunLoopObserverRef observer = CFRunLoopObserverCreateWithHandler(CFAllocatorGetDefault(), kCFRunLoopAllActivities, YES, 0, ^(CFRunLoopObserverRef observer, CFRunLoopActivity activity) {
            NSLog(@"----监听到RunLoop状态发生改变---%zd", activity);
        });
       
        添加观察者:监听RunLoop的状态
        CFRunLoopAddObserver(CFRunLoopGetCurrent(), observer, kCFRunLoopDefaultMode);
       
        释放Observer
        CFRelease(observer);
       
         Core Foundation内存管理
         * 遇到Creat copy retain 等创建变量 需要对变量进行内存管理
         *在使用完之后 对其进行Release 调用CFRelease(释放的变量)
        
     
  • 相关阅读:
    七、vertical-align属性、透明度属性及兼容、ps常用工具、常见的图片格式、项目规范、命名参考、iconfont的使用
    自定义注解!绝对是程序员装逼的利器!!
    令人爱不释手的Python列表推导式
    用Python画colorbar渐变图+修改刻度大小+修改渐变颜色
    pandas:使用函数批量处理数据(map、apply、applymap)
    【Python3】xlwt/xlrd模块读取和新建excel并生成直方图
    什么是可串行化MVCC
    python计算和媳妇在一起天数的小程序,最后绘制成花.
    520了,用32做个简单的小程序
    “TensorFlow 开发者出道计划”全攻略,玩转社区看这里!
  • 原文地址:https://www.cnblogs.com/LzwBlog/p/5388568.html
Copyright © 2011-2022 走看看