RunLoop 初识

/*

RunLoop 作用:

*保证程序持续运行

*处理App中的各种事件 (触摸 定时器 selector)

*如果没人让App处理事件 RunLoop会进入休眠状态

*节省CPU资源 提高程序性能. 该做事情的时候做事, 该休息的时候休息

*/

/*

RunLoop 在 iOS中有两套API

*Foundation

NSRunLoop

*Core Foundation 大部分东西 都是C语言的

NSRunLoop 封装了CFRunLoopRef

*

*/

- (void)viewDidLoad {

[super viewDidLoad];

self.view.backgroundColor = [UIColor grayColor];

/*

RunLoop与线程的关系:

每个线程都有一个与之对应的RunLoop

主线程的RunLoop在程序启动是 自动创建

子线程则需要你自己手动创建

*/

//1.获取RunLoop (准确的说,是获取当前线程的RunLoop)

[NSRunLoop currentRunLoop];

//获取主线程的RunLoop

[NSRunLoop mainRunLoop];

//子线程的RunLoop(这是需要我们自己创建的)默认情况下NSTimer被加入NSDefalutRunLoopMode

// 如果想NSTimer受到组件或者动画影响 添加到NSRunLoopCommonModes(OC代码如下:)

NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(threadAction) object:nil];

[thread start];

//2.mode 代表运行模式

/*

*RunLoop是有多个模式的,但是一个RunLoop只能选择一种模式运行, 如果想要切换模式,需要退出当前模式

*如果选择一个模式执行, 则只能运行当前模式下的事件

*/

/*

kCFRunLoopDefaultMode 默认模式 主线程默认的模式

UITrackingRunLoopMode 界面跟踪模式 ScrollView滑动时走的模式

kCFRunLoopCommonModes 占位模式 (包含上面两种模式,若把事件添加到此模式下,事件在上面两种模式都可以响应)

*/

[self timerAction];

[self observer];

}

- (void)threadAction{

//懒加载 创建RunLoop

//    NSLog(@"%@",[NSRunLoop currentRunLoop]);

}

- (void)timerAction{

//    [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(timerEvent:) userInfo:nil repeats:YES];

NSTimer *timer = [NSTimer timerWithTimeInterval:2 target:self selector:@selector(timerEvent:) userInfo:nil repeats:YES];

[[NSRunLoop currentRunLoop] addTimer:timer forMode:UITrackingRunLoopMode]; //UITrackingRunLoopMode界面跟踪模式 ScrollView滑动时走的模式 ??哈哈试一试

/*

NSDefaultRunLoopMode 默认模式 主线程默认的模式

UITrackingRunLoopMode 界面跟踪模式 ScrollView滑动时走的模式

NSRunLoopCommonModes 占位模式 (包含上面两种模式,若把事件添加到此模式下,事件在上面两种模式都可以响应)

*/

}

- (void)timerEvent:(NSTimer *)sender{

NSLog(@"timer ??");

}

- (void)observer{

//    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(释放的变量)

*/

}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{

NSLog(@"??");

}

时间: 2024-10-26 16:49:16

RunLoop 初识的相关文章

iOS runloop详解

写这篇文章开始之前,我都不知道runloop是什么东西,如果从字面的意思翻译应该是一直循环的跑,怀疑可能和死锁有关系,可是死锁具体是怎么回事,我只是记得有这个说法,也发现了一个自己不懂的知识. 初识runloop 我在网上看了一下@sunnnyxx 关于runloop的视频.了解了一下runloop相关知识,也去网络上看各种关于runloop的讲述. 我们一般程序就是执行一个线程,是一条直线,有起点终点,而runloop就是一直在线程上面画圆圈,一直在跑圈,除非切断否则一直在运行.网上说的比喻很

iOS开发中对RunLoop的个人心得

从接触iOS到现在也有将近两年了,对iOS中的RunLoop也有了一定的认识,下面讲讲个人对RunLoop的理解.   初识RunLoop RunLoops是与线程相关联的基础部分,一个Run Loop就是事件处理循环,他是用来调度和协调接收到的事件处理.使用RunLoop的目的,就是使的线程有工作需要做的时候忙碌起来,当没事做的时候,又可以使得线程休眠. 我们一般程序就是执行一个线程,是一条直线.有起点终点.而runloop就是一直在线程上面画圆圈,一直在跑圈,除非切断否则一直在运行.网上说的

初识Python,望君多多关照

在学习Python之前,我们接触过数据结构和网页制作.前者让我们学习如何把C语言运用的更加整齐规范,而后者让我们亲身学习如何运用所学,制作一个静态网页.通过这些课程的学习,让我对C语言产生了比较大的压力,以至于对编程.对这学期的Python课程都有一种如临大敌的感觉. 但是真的学习了这门课程,体会了编码过程中的一些固定运用方法和套路之后,也许过程中对这门课程隐隐约约产生了一点点朦胧的感觉,仿佛他也并没有想象中的那么困难,起码现在的学习让我认为,他可能没有C语言那么繁琐和麻烦.当然,以一个初学者的

初识数组排序!!!!

<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>初识数组排序</title> <!--调试成功--> <style type="text/css"> *{ padding:0; margin: 0; } li,ul{ list-style: none; } #p

初识操作系统和linux

初识操作系统和linux 1.计算机系统由硬件系统和软件系统两大部分组成:是一种能接收和存储信息,并按照存储在其内部的程序对海量数据进行自动.高速地处理,然后把处理结果输出的现代化智能电子设备. 2.世界上第一台计算机是1946年诞生在美国宾州大学. 3.冯·诺依曼体系结构:1946年数学家冯·诺依曼于提出计算机硬件系统由运算器.控制器.存储器.输入设备.输出设备.摩根定律:当价格不变时,集成电路上可容纳的元器件的数目,约每隔18-24个月便会增加一倍,性能也将提升一倍.现在计算机技术进本很难遵

JAVA 初识类加载机制 第13节

JAVA 初识类加载机制 第13节 从这章开始,我们就进入虚拟机类加载机制的学习了.那么什么是类加载呢?当我们写完一个Java类的时候,并不是直接就可以运行的,它还要编译成.class文件,再由虚拟机解释给当前的操作系统去执行.这些过程都是我们看不见的,我们能看见的也就是一个.class文件.既然虚拟机要解释这些.class文件给当前的操作系统听,那么他怎么获得这些.class文件呢?虚拟机获得这些.class文件的过程就是类加载了. 所以,总结来说就是:虚拟机将.class文件从磁盘或者其他地

初识React

原文地址:北云软件-初识React 专注于UI 在MVC分层设计模式中,react常被拿来实现视图层(V).React不依赖于技术栈的其他部分,因此可以方便的在现有项目中尝试用它来实现一个小特性. 虚拟DOM React从DOM中抽象出来,给出一种更简洁的编程模型,且性能表现更好.能够通过NodeJS实现服务端渲染,通过React Native开发原生app. 数据流React实现单向.响应式数据流,减少boilerplate且比传统数据绑定更容易理解. 简洁的组件React的组件都实现了一个r

泛型的几种类型以及初识webform

今天学习的可以分为两类吧,但是学习的都是比较抽象的,不太容易掌握吧.首先我们大部分时间学习了泛型,泛型的委托,泛型接口以及枚举器,迭代器,扩展方法:最后简单的认识了webform,实现了一个简单的功能. 一.泛型 定义:泛型(generic)可以软糖多个类型共享一组代码,泛型允许我们声明类型参数化.可以用不同的类型进行实例化,说白了,就是可以用类型占位符,创建具体类型致命的真实概念.C#中提供了五种泛型,类,结构,接口,委托和方法.下面举例说明可能更容易理解, class MyStack<T>

最新计算机技术与管理科学应用专家——初识ERB

ERB管理系统:英文全称Enterprise Resource and Behavior,英文简称:ERB,中文名全称:企业资源与行为管理系统.ERB是由理文企业管理顾问有限公司首席管理师,现任商翼ERB企业管理系统项目总监吴志华先生,于2010年9月首先提出的.ERB不再单以供应链管理作为系统应用的基础,而是以企业行为与企业资源规划的最佳结合作为系统应用设计的核心基础,强调企业行为的规划.执行.监督与追溯,强调企业管理水平与员工素养的持续提升:提供企业行为与企业资源管理最佳结合的整体应用解决方