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(释放的变量)
        
     
  • 相关阅读:
    论 mysql 主键
    详解 hibernate 悲观锁 乐观锁 深入分析 代码实例
    Mysql 如何 删除大表
    JSP 不能用 不支持 STRUTS标签 报错 The Struts dispatcher cannot be found.
    struts2 防止重复提交 实例代码
    ECLIPSE MYECLIPSE 在线安装SVN
    powerdesigner中给一主键设为自增型auto_increment
    GDAL计算栅格图像统计值相关说明
    GDAL使用DEM数据计算坡度坡向
    到底什么是I/O Port,什么是Memorymapped I/O
  • 原文地址:https://www.cnblogs.com/LzwBlog/p/5388568.html
Copyright © 2011-2022 走看看