RunLoop

【iOS】RunLoop Mode到底包含哪些类型的元素?前面提到过:存储所有commonMode的itemsourcetimerobserver上面的SourceTimerObserver被统称为mode item所有的mode item都可以被添加到Mode中,Mode中可以包含多个mode item,一个item也可以被加入多个mode。但一个item被重复加入同一个mode时是不会有效果的。如果一个mode中一个item都没有,则RunLoop会退出,不进入循环。 阅读详情

01基本认识

什么是RunLoop
顾名思义
运行循环
在程序运行过程中循环做一些事情
当我一启动IOS程序的时候,他内部就会创建一个RunLoop对象,循环做一些事情

  • 应用范畴
    定时器(Timer)、PerformSelector
    GCD Async Main Queue
    事件响应、手势识别、界面刷新
    网络请求
    AutoreleasePool

如果没有RunLoop程序执行完main函数就会退出,
为了保证程序一直在运行之后,他就引入了RunLoop,当我们执行main函数调用UIApplicationMain的时候,就会创建RunLoop对象。
他内部大概是这个样的

int retVal = 0;
    do {
        //睡眠中等待消息
        int message = sleep_and_wait();
        //处理消息
        retVal = process_message(message)
    } while (retVal == 0);

当执行完main之后,程序不会马上退出,而是保持运行状态
RunLoop的基本作用
保持程序的持续运行
处理App中的各种事件(比如触摸事件、定时器事件等)
节省CPU资源,提高程序性能:该做事时做事,该休息时休息

02获取RunLoop对象

IOS没有RunLoop会马上退出,执行main返回0,程序立即退出。
RunLoop有两个,一个是OC的一个是C语言的

NSRunLoop *runloop = [NSRunLoop currentRunLoop];
    CFRunLoopRef runloopR = CFRunLoopGetCurrent();

iOS中有2套API来访问和使用RunLoop
Foundation:NSRunLoop
Core Foundation:CFRunLoopRef
NSRunLoop和CFRunLoopRef都代表着RunLoop对象
NSRunLoop是基于CFRunLoopRef的一层OC包装
CFRunLoopRef是开源的https://opensource.apple.com/tarballs/CF/

Runloop与线程的关系
1.每条线程都有唯一的一个与之对应的RunLoop对象
2. RunLoop保存在一个全局的Dictionary里,线程作为key,RunLoop作为value
3. 线程刚创建时并没有RunLoop对象,RunLoop会在第一次获取它时创建
4.RunLoop会在线程结束时销毁
5. 主线程的RunLoop已经自动获取(创建),子线程默认没有开启RunLoop

NSLog(@"%p--%p", CFRunLoopGetCurrent(), CFRunLoopGetMain());
    0x600001e6cc00--0x600001e6cc00
    NSLog(@"%p--%p", [NSRunLoop currentRunLoop], [NSRunLoop mainRunLoop]);
 0x600000660000--0x600000660000

打印结果不一样是因为NSRunLoop是对CFRunLoop的包装,他里面存放着CFRunLoop,一个线程对应唯一一个runloop
通过查看源码,我们可以看出当我们执行CFRunLoopGetCurrent-> CFRunLoopGet0->里面有个CFGetDictionaryValue取RunLoop,根据一个thread的key,如果一开始runloop对象不存在,他就创建一个runloop,然后把它添加到字典之中

03CFRunLoopModeRef

如果要寻做一些事,仅仅有这个RunLoop对象是不行,他还要以来其他的对象

Core Foundation中关于RunLoop的5个类
CFRunLoopRef
CFRunLoopModeRef
CFRunLoopSourceRef
CFRunLoopTimerRef
CFRunLoopObserverRef

CFRunLoop的结构

CFRunLoop

可以看出,他和线程是一一对应的关系,他有一个集合存放着他的mode,这里面只有一个mode是currentMode,
mode的结构

mode

source0和source1里面装的CFRunLoopSourceRef这种对象
observers里面装的是CFRunLoopObserverRef这种对象

内存结构
  • CFRunLoopModeRef代表RunLoop的运行模式
  • 一个RunLoop包含若干个Mode,每个Mode又包含若干个Source0/Source1/Timer/Observer
  • RunLoop启动时只能选择其中一个Mode,作为currentMode
  • 如果需要切换Mode,只能退出当前Loop,再重新选择一个Mode进入
  • 不同组的Source0/Source1/Timer/Observer能分隔开来,互不影响
  • 如果Mode里没有任何Source0/Source1/Timer/Observer,RunLoop会立马退出
  • 常见的2种Mode
    kCFRunLoopDefaultMode(NSDefaultRunLoopMode):App的默认Mode,通常主线程是在这个Mode下运行
    UITrackingRunLoopMode:界面跟踪 Mode,用于 ScrollView 追踪触摸滑动,保证界面滑动时不受其他 Mode 影响

04CFRunLoopModeRef的成员

通过控制台bt可以打印函数调用栈

Source0
    触摸事件处理
    performSelector:onThread:
    
    Source1
    基于Port的线程间通信
    系统事件捕捉,比如点击屏幕产生的事件就是他捕捉到的,然后再交给source0处理
    
    Timers
    NSTimer
    performSelector:withObject:afterDelay:
    
    Observers
    用于监听RunLoop的状态
    UI刷新(BeforeWaiting),当前听器间听到runloop要睡觉了,他就会进行一次UI页面刷新
比如设置颜色,当你值完代码,他先保留住,一旦监听到睡觉,就是刷新
    Autorelease pool(BeforeWaiting)//他在什么时候释放对象,一旦监听到要睡觉了,就清理一下自动释放的对象

05CFRunLoopObserverRef

Observer

CFRunLoopObserverRef

监听runloop的状态Observer,没有OC的API我们只能通过CF的函数形式添加Observer
手动创建一个Observer监听runloop的状态

void observerCall(CFRunLoopObserverRef observer, CFRunLoopActivity activity, void *info)
{
    typedef CF_OPTIONS(CFOptionFlags, CFRunLoopActivity) {
        kCFRunLoopEntry = (1UL << 0),
        kCFRunLoopBeforeTimers = (1UL << 1),
        kCFRunLoopBeforeSources = (1UL << 2),
        kCFRunLoopBeforeWaiting = (1UL << 5),
        kCFRunLoopAfterWaiting = (1UL << 6),
        kCFRunLoopExit = (1UL << 7),
        kCFRunLoopAllActivities = 0x0FFFFFFFU
    };
    //监听状态
    switch (activity) {
        case kCFRunLoopEntry:
            NSLog(@"kCFRunLoopEntry");
            break;
            
        case kCFRunLoopBeforeTimers:
            NSLog(@"kCFRunLoopBeforeTimers");
                
            break;

        case kCFRunLoopBeforeSources:
            NSLog(@"kCFRunLoopBeforeSources");
            break;

        case kCFRunLoopBeforeWaiting:
            NSLog(@"kCFRunLoopBeforeWaiting");
            break;

        case kCFRunLoopExit:
            NSLog(@"kCFRunLoopExit");
            break;
        default:
            break;
    }
}
- (void)viewDidLoad
{
    [super viewDidLoad];
    
    //创建一个observer
    CFRunLoopObserverRef observer = CFRunLoopObserverCreate(kCFAllocatorDefault, kCFRunLoopAllActivities, YES, 0, observerCall, NULL);
    //添加一个observer
    //kCFRunLoopCommonModes
    CFRunLoopAddObserver(CFRunLoopGetCurrent(), observer, kCFRunLoopCommonModes);
    CFRelease(observer);
    
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    NSLog(@"------");
}

监听模式的改变,可以拖一个scrollView拖动一下改变的runloop的mode

//监听状态
    switch (activity) {
        case kCFRunLoopEntry:
            NSLog(@"kCFRunLoopEntry---%@",CFRunLoopCopyCurrentMode(CFRunLoopGetCurrent()));
            break;
        case kCFRunLoopExit:
            NSLog(@"kCFRunLoopExit---%@", CFRunLoopCopyCurrentMode(CFRunLoopGetCurrent()));
            break;
        default:
            break;
    }
//log
 kCFRunLoopExit---kCFRunLoopDefaultMode
2020-10-26 21:56:57.104392+0800 RuntimeIsa[1573:89315] kCFRunLoopEntry---UITrackingRunLoopMode
2020-10-26 21:56:57.315033+0800 RuntimeIsa[1573:89315] kCFRunLoopExit---UITrackingRunLoopMode
2020-10-26 21:56:57.315199+0800 RuntimeIsa[1573:89315] kCFRunLoopEntry---kCFRunLoopDefaultMode

06答疑

循环做把mode里面source拿出来处理,
source里面的东西是不固定的

07执行流程图

在IOS我们表面上能看到的Runloop就是applicationMain
要想看到他具体做了什么事情,就要分析源码,但是源码太过于抽象,纯c。可以先看下总结图片。他大概就是不断的切换mode,然后处理不同模式喜爱的source0 ,source1,timer等
handleport就是source1 可能是别的线程发过来的信息

Runloop工作流程
运行逻辑

08-源码分析

通过打断点,在控制台输入bt指令,来打印省略的步骤可以查看到他调用了一个CFRunLoopSpecific的函数->CFRunloopRun这个函数里面就是他在做的处理,就是一个do-while循环

__CFRunLoopRef  rl,  CFRunLoopModeRef rum
int32_t retVal = 0;

do
{
    //通知Obervers,即将处理Timers
__CFRunLoopDoObservers(rl,rlm,kCFRunLoopBeforeTimers);
    //通知Obervers,即将处理Sources
__CFRunLoopDoObservers(rl,rlm,kCFRunLoopBeforeSources);  
//处理Blocks
__CFRunLoppDoBlocks(rl,rlm)

//处理source0
if (__CFRunloopDoSource0(rl,rlm,stopAfterHandle))
{
//处理block;
}

}while(0 == retVal);

//判断有无source1,如果有就跳到,handle_msg

//通知observer即将进入休眠
__CFRunLoopDoObservers(rl,rlm,kCFRunLoopBeforeSleeping);
__CFRunLoopSetSleeping(rl);

//等待别的消息来唤醒当前线程
__CFRunLoopServiceMachPort

handle_msg:
if(被time唤醒)
{
//处理timers
}else if(被GCD唤醒)
{
//处理GCD
}else
{//被source1唤醒,
//处理source1
}
//处理block

//设置返回值

如果返回值retVal还是 == 0;
那么就会回到开头从新循环

09调用细节

我们平时所做的UI界面刷新,timer定时器的监听,自动释放池都是疣runloop来做控制的,它主要做这几件事件,1 doObservers, 2 doBlocks 3. doSource03. doSource01 4doTimers5,处理gcd 6 休眠,这些函数里面还会调用一个__CFRUNLOOP_IS_CALLING_TO开头的函数

  • GCD有自己的逻辑,他很多东西不依赖RunLoop,他有一种情况会交给runloop处理
dispatch_async(dispatch_get_global_queue(0, 0), ^{
        //处理子线程的逻辑
        
        dispatch_async(dispatch_get_main_queue(), ^{
           //回到住线程刷新界面
        });
        
    });

01、通知Observers:进入Loop
02、通知Observers:即将处理Timers
03、通知Observers:即将处理Sources
04、处理Blocks
05、处理Source0(可能会再次处理Blocks)
06、如果存在Source1,就跳转到第8步
07、通知Observers:开始休眠(等待消息唤醒)
08、通知Observers:结束休眠(被某个消息唤醒)
01> 处理Timer
02> 处理GCD Async To Main Queue
03> 处理Source1
09、处理Blocks
10、根据前面的执行结果,决定如何操作
01> 回到第02步
02> 退出Loop
11、通知Observers:退出Loop

10-休眠的细节

开始睡觉意味着当前线程不做事情了,相当于阻塞了,这个阻塞和我们所写的while(1)(并没有休眠,线程还是在做事情)这种不一样,他是线程休息了什么代码也不执行了
通过调用mach_msg来调用内核层面的API实现线程的休眠的目的
当我们在用户态执行了mach_msg函数之后,他会进入内核态,调用内核态的mach_msg的实现,来达到休眠的目的。没消息就让线程休眠,有消息就唤醒线程。回到用户态处理消息,通过状态切换真正达到了让线程休息

状态切换

runloop是怎么响应用户的操作的?
首先它是由source1来把用户事件捕捉,点击。source1会把这个事件,包装成事件队列,放到事件队列里面去。事件队列又是在source0里面处理的

说说runloopd的几种状态
kCFRunLoopEntry = (1UL << 0),
kCFRunLoopBeforeTimers = (1UL << 1),
kCFRunLoopBeforeSources = (1UL << 2),
kCFRunLoopBeforeWaiting = (1UL << 5),
kCFRunLoopAfterWaiting = (1UL << 6),
kCFRunLoopExit = (1UL << 7),
kCFRunLoopAllActivities =
runloop的mode作用是什么?
常见的2种Mode
kCFRunLoopDefaultMode(NSDefaultRunLoopMode):App的默认Mode,通常主线程是在这个Mode下运行
UITrackingRunLoopMode:界面跟踪 Mode,用于 ScrollView 追踪触摸滑动,保证界面滑动时不受其他 Mode 影响
mode可以将不同的source0/source1/t/o隔离开来。他们之间相互隔离不受影响

11NSTimer失效

runloop实际开发中的应用,
控制线程生命周期(线程保活),有时候我们不希望子线程运行完就销毁,
解决NSTimer在滑动时停止工作的问题
监控应用卡顿
性能优化

默认下的NSTimer我们一拖拽UI控件,他就会停止运行,因为我们在拖拽的时候,runloop切换了mode,定时器是在默认模式下工作的

//用这个方法创建的定时器是加到默认模式下的
    [NSTimer scheduledTimerWithTimeInterval:1 repeats:YES block:^(NSTimer * _Nonnull timer)
    {
        NSLog(@"%i", ++count);
    }];
iOS RunLoop的总结 RunLoop是iOS开发核心的事件循环机制,它负责管理线程的生命周期、处理各类事件。主线程的RunLoop默认开启,子线程需要手动获取并维护RunLoop。以上就是对RunLoop的一些总结。 阅读详情

相关推荐

iOS进阶教程2-RUNLOOP优化大图加载

1 为什么要优化大图加载 大图片在渲染的时候,比较耗费时间 我们利用RUNLOOP 来优化: 思路:1.每一次RUNLOOP,都只加载一个小任物,把图片任务放到数组,从数组循环来加载.这样可以是项目达到流畅. 2.只加载当前视图内的图片任务 3.为了不让runloop休眠.我们要用一个timer区持有这个runloop 或者 通知注册runloop事件,让快要睡眠...

Coder Bruce 1619

深入理解Runloop,看我一篇就够了

前言 RunLoop 是 iOS 和 OSX 开发中非常基础的一个概念,为了让大家更加快速融入,请先一段代码: + (NSThread *)networkRequestThread { static NSThread *_networkRequestThread = nil; static dispatch_once_t oncePredicate; dispatc

iiiiiiiiiihero的专栏 1万+

lvds接口_LVDS,接口,时序讲解,非常好的文章

欢迎FPGA工程师加入官方微信技术群点击蓝字关注我们FPGA之家-中国最好最大的FPGA纯工程师社群1.1.1 LVDS接口分类1.1.1.1 单路6bit LVDS这种接口电路中,采用单路方式传输,每个基色信号采用6位数据,共18位RGB数据,因此,也称18位或18bit LVDS接口。此,也称18位或18bit LVDS接口。1.1.1.2 双路6bit LVDS这种接口电...

weixin_39639286的博客 1902

RunLoop的一些理解

1.Runloop与dispatch的关系 1.在__CFRunLoopRun函数中,用dispatch_source_create创建一个定时器。处理此次runLoop mode的运行时间,唤醒Runloop 2.使用dispatch的任务,例如 dispatch_async 提交的任务 dispatch_after 提交的延时任务 dispatch_source_create dispatch_source_set_timer dispatch_source_set_event_handler 设置的

勿在浮沙筑高楼 1209

周志华《机器学习》课程系列笔记——目录导航页

最近自学机器学习课程,注意到了南京大学周志华老师的课程。我是在学堂在线平台观看的,注意到b站上也有相应视频,但b站上并未获得授权,随时有消失的可能。周志华老师的网络教学视频中,与其西瓜书相比确实少了一些内容。但幸运的是,缺失的内容实际上对于初学者来说并不会产生太大影响。目前这一笔记也遵循视频内容,相比西瓜书中也会有一些缺失,敬请谅解。可能以后如果有机会和时间,我会再阅读周志华老师的书籍将缺失内容补全。一切内容敬请关注我的个人Page页面。

Sinocifengs的博客 1687

CV领域交叉注意力机制:QKV在图像特征增强中的核心作用解析

本文深入解析了CV领域中交叉注意力机制的核心组件QKV在图像特征增强中的关键作用。通过通俗类比和实战案例,阐述了Q(查询)、K(键)、V(值)如何协同实现动态权重分配,从而在目标检测、图像分割与生成等任务中显著提升模型性能与语义对齐能力。

weixin_29194817的博客 438

【iOS】—— RunLoop详解

一般来说,一个线程一次只能执行一个任务,执行完成后线程就会退出。就比如之前学OC时使用的命令行程序,执行完程序就结束了。而runloop目的就是使线程在执行完一次代码之后不会结束程序,而是使该线程处于一种休眠的状态,等待有事件需要处理的时候,再醒来处理。简单的来说,runloop可以让线程在需要做事的时候忙起来,不需要的时候让线程休眠,使程序不会结束。RunLoop需要处理的消息,包括time以及source消息,他们都属于Mode item。......

m0_55124878的博客 3521

SAP PP未清生产订单关闭物料退料、新工单发料批量处理

( werks = '1001' lgort = 'A004' lgobe = '组装-成品组装' )( werks = '1002' lgort = 'C006' lgobe = '组装-二车间' )( werks = '1002' lgort = 'C007' lgobe = '组装-二车间' )( werks = '1001' lgort = 'A007' lgobe = '组装-MS' )( werks = '1001' lgort = 'A008' lgobe = '组装-GW' )

dingqing86的专栏 1192

【iOS】——RunLoop学习

一个线程一次只能执行一个任务,执行完毕后就会退出。do {//获取消息//处理消息} while (消息!= 退出)这种模型通常被称为Event Loop,Event loop 在很多系统和框架都有实现。例如:Node.js 的事件处理,Windows 程序的消息循环,而在macOS、iOS中就是Run Loop。简单的说RunLoop其实就是一种循环,通过这种循环得以让应用程序持续运行,让线程能随时处理事件,并在线程需要进行事件处理时忙起来,在不需要进行事件处理时闲下来。

m0_73974920的博客 2762

【华为机试真题 Python实现】分苹果

《华为机试真题》专栏含牛客网华为专栏、华为面经试题、华为OD机试真题。如果您在准备华为的面试,期间有想了解的可以私信我,我会尽可能帮您解答,也可以给您一些建议!本文解法非最优解(即非性能最优)。A,B两个人把苹果分为两堆,A希望按照它的计算规则等分苹果,他的计算规则是按照二进制加法计算,并且不计算走位,12+5=9(1100+0101=9), B的计算规则是十进制加法,包括正常进位,B希望在满足A的情况下获取苹果重量最多,输入苹果的数量和每个苹果重量,输出满足A的情况下获取的苹果总重量, 如果无法满足A的要

3413

WPF 上位机可视化天花板:HandyControl 搭建 SCADA 系统

HandyControl 凭借「丰富的工业级控件、灵活的主题定制、优异的性能」,成为 WPF 开发 SCADA 系统的首选 UI 库。本文搭建的 SCADA 系统涵盖实时监控、设备控制、报警管理、趋势分析四大核心功能,通过 HandyControl 实现了工业级可视化效果,开发效率提升 60% 以上。控件开箱即用:无需自定义仪表盘、趋势图、指示灯等 SCADA 核心控件;可视化效果专业:工业风主题、动态颜色切换、清晰的状态呈现,契合工业场景需求;

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1126

iOS Runloop探索(快速了解Runloop)

Runloop是一个事件处理循环,用于调度工作并协调接收传入事件。Runloop 的目的是在有工作要做的时候让线程保持忙碌,在没有工作的时候让线程休眠。本篇文章就对Runloop进行一个简单的阐述,希望能帮到需要了解的同仁。

郭永明的技术专栏 4073

OpenCV 实战篇——如何测算出任一副图片中的物体的实际尺寸?传感器尺寸与像元尺寸的关系?

本文介绍了通过相机图像测算物体实际尺寸的方法,重点分析了传感器参数与成像质量的关系。文章首先给出了物体实际尺寸的计算公式,涉及像素尺寸、距离、分辨率等参数。然后详细解析了传感器尺寸与像元尺寸的关系,指出相同分辨率下更大的传感器能获得更好的成像质量。此外还介绍了光学尺寸、像素尺寸对成像的影响,以及帧率的概念。最后提及了相机标定的重要性,并概述了从像素坐标系转换到世界坐标系的基本思路。这些知识为通过相机图像进行精确测量提供了理论基础。

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 1336

iOS——runLoop

RunLoop实际上就是一个对象,这个对象管理了其需要处理的事件和消息,并提供了一个入口函数来执行相应的处理逻辑。线程执行了这个函数后,就会处于这个函数内部的循环中,直到循环结束,函数返回。RunLoop是一种高级的循环机制,让程序持续运行,并处理程序中的各种事件,让线程在需要做事的时候忙起来,不需要的话就让线程休眠。RunLoop和线程是绑定在一起的,每条线程都有唯一一个与之对应的RunLoop对象。不能自己创建RunLoop对象,但是可以获取系统提供的RunLoop对象。

m0_73348697的博客 2737

6万字嵌入式最全八股文面试题大全及参考答案(持续更新)

进程上下文定义:进程上下文包含了进程执行时所需的所有信息,包括 CPU 寄存器的值、内核栈、任务控制块(TCB)等。作用:当进程被切换时,需要保存当前进程的上下文,并恢复下一个将要运行进程的上下文。中断上下文定义:中断上下文是指处理中断时 CPU 所处的状态,包括中断发生时的寄存器值等。作用:当中断发生时,CPU 会自动保存当前的上下文信息,并跳转到相应的中断处理程序。示例表格上下文描述进程上下文包含进程执行时的所有相关信息中断上下文处理中断时 CPU 所处的状态线程同步定义。

大模型大数据攻城狮的专栏 7929

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

【iOS】Runloop

先前学习了Runtime的内容,现在来学习一下Runloop本文介绍玩Runloop,应该懂得:Runloop事件上就是一个事件循环,也可以当作一个对象,这个对象实际上就是用来处理消息与事件的,其提供了一个入口函数去执行EventLoop同时Runloop中又包含五种Mode,其中最常用的是,Mode中又有ModeItems的集合,如果一个Mode中没有items,那么runloop就会退出,items是指。

weixin_72437555的博客 1246

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Runloop解析

​ RunLoop——运行循环(死循环),它提供了一个事件循环机制在程序运行过程中处理各种事件,例如用户交互、网络请求、定时器等等。RunLoop可以在需要的时候自己跑起来运行,在没有操作的时候就停下来休息,充分节省CPU资源,提高程序性能。

yueliangmua的博客 1435

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

RunLoop源码详解

文章目录RunLoop是什么NSRunLoop和CFRunLoopRunLoop内部结构RunLoop源码__CFRunLoop结构体__CFRunLoopMode结构体__CFRunLoopSource结构体CFRunLoopSourceContextCFRunLoopSourceContext1__CFRunLoopTimer结构体__CFRunLoopObserver结构体 RunLoop是什么 如果没有RunLoop,那么该线程在执行完自己的任务时就会退出;而我们在使用APP时,通常不会只执行完一个

吃橘子 980

【iOS】RunLoop学习

这篇博客起源于一个问题,为什么自动轮播图在滑动tableView时就停止滚动了。以上就是我学习RunLoop的总结,后续我讲继续补充完善我的博客。

2401_87841908的博客 400

RunLoop源码剖析---图解RunLoop

文章目录RunLoop源码剖析---图解RunLoop前言什么是RunLoop?RunLoop的作用RunLoop在何处开启?RunLoop对象RunLoop对象的获取CFRunLoopRef对象源码剖析RunLoop和线程RunLoop的相关类RunLoop的相关类之间关系各个类的作用RunLoop中的ModeCFRunLoopModeRef__CFRunLoopMode源码剖析__CFRunL...

qq_42376419的博客 1533

第9章:RunLoop面试问题

一、概念      1、什么是RunLoop? RunLoop是通过内部维护的事件循环来对事件/消息进行管理的一个对象。      2、什么是事件循环? 没有消息需要处理时,休眠以避免资源占用,此时当前线程的控制权由用户态切换到内核态;有消息需要处理时,立即被唤醒,此时状态由内核态切换到用户态。      3、应用程序的main函数为什么能一直运行不退出? 因为main函数中调用了UI...

BlackWolfSky的博客 589

[iOS]-RunLoop

iOS-RunLoop浅谈

m0_52192682的博客 614

深入浅出 RunLoop(四):RunLoop 与线程

RunLoop 系列文章 深入浅出 RunLoop(一):初识 深入浅出 RunLoop(二):数据结构 深入浅出 RunLoop(三):事件循环机制 深入浅出 RunLoop(四):RunLoop 与线程 深入浅出 RunLoop(五):RunLoop 与 NSTimer 深入浅出 RunLoop(六):相关面试题 RunLoop 与线程的关系 苹果官方文档中,RunLoop的相关介绍写在线程编...

weixin_42350379的博客 1449

【iOS】—— RunLoop初学

简单的说 RunLoop是一种高级的循环机制,让程序持续运行,并处理程序中的各种事件,让线程在需要做事的时候忙起来,不需要的话就让线程休眠。在App运行的过程中,主线程的Runloop保证了主线程不被销毁从而保证应用的存活,从而能实时接收到用户的响应事件,能够触发定时事件。如果没有Runloop的话,程序执行完代码就会立马return。RunLoop需要处理的消息,包括time以及source消息,他们都属于Mode itemRunLoop也可以被监听,被监听的对象是observer对象,也属于。

m0_62386635的博客 1044
上一篇: Block循环引用
下一篇: 多线程-GCD
I微微一笑I
博客等级 码龄11年 0粉丝 86原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值