runloop

Runtime & Runloop

给你一囗甜甜゛ 提交于 2020-01-12 22:51:47
方法->底层会编译成消息->消息查找会使用递归查找 元类是一种虚拟的类,系统实现的,用来存储类对象的 对象分为: 1. 实例对象:存在类里面, 2. 类对象:存在元类里面 实例方法: 递归查找父类 -> 最终会查找到NSObject 如果没有实现就会进入动态方法解析 /*--> */ /*--> */ /*********************************************************************** * lookUpImpOrForward. * The standard IMP lookup. * initialize==NO tries to avoid +initialize (but sometimes fails) * cache==NO skips optimistic unlocked lookup (but uses cache elsewhere) * Most callers should use initialize==YES and cache==YES. * inst is an instance of cls or a subclass thereof, or nil if none is known. * If cls is an un-initialized metaclass then a non

深入理解CADisplayLink和NSTimer

你离开我真会死。 提交于 2020-01-05 04:10:44
一、什么是CADisplayLink 简单地说,它就是一个定时器,每隔几毫秒刷新一次屏幕。 CADisplayLink是一个能让我们以和屏幕刷新率相同的频率将内容画到屏幕上的定时器。我们在应用中创建一个新的 CADisplayLink 对象,把它添加到一个runloop中,并给它提供一个 target 和 selector 在屏幕刷新的时候调用。 一但 CADisplayLink 以特定的模式注册到runloop之后,每当屏幕需要刷新的时候,runloop就会调用CADisplayLink绑定的target上的selector,这时target可以读到 CADisplayLink 的每次调用的时间戳,用来准备下一帧显示需要的数据。例如一个视频应用使用时间戳来计算下一帧要显示的视频数据。在UI做动画的过程中,需要通过时间戳来计算UI对象在动画的下一帧要更新的大小等等。 在添加进runloop的时候我们应该选用高一些的优先级,来保证动画的平滑。可以设想一下,我们在动画的过程中,runloop被添加进来了一个高优先级的任务,那么,下一次的调用就会被暂停转而先去执行高优先级的任务,然后在接着执行CADisplayLink的调用,从而造成动画过程的卡顿,使动画不流畅。 duration属性:提供了每帧之间的时间,也就是屏幕每次刷新之间的的时间

NSTimer理解

半城伤御伤魂 提交于 2020-01-05 04:06:00
NSTimer 其实是将一个监听加入的系统的 RunLoop 中去,当系统 runloop 到如何 timer 条件的循环时,会调用 timer 一次,当 timer 执行完,也就是回调函数执行之后, timer 会再一次的将自己加入到 runloop 中去继续监听。 CFRunLoopTimerRef 和 NSTimer 这两个类型是可以互换的, 当我们在传参数的时候,看到 CFRunLoopTimerRef 可以传 NSTimer 的参数,增加强制转化来避免编译器的警告信息 指定(注册)一个 timer 到 RunLoops 中 一个 timer 对象只能够被注册到一个 runloop 中在同一时间,尽管在这个 runloop 中它能够被添加到多个 runloop 中模式中去。 有以下三种方法: 使用 scheduledTimerWithTimeInterval:invocation:repeats: 或者 scheduledTimerWithTimeInterval:target:selector:userInfo:repeats: 这两个类方法创建一个 timer 并把它指定到一个默认的 runloop 模式中 使用 timerWithTimeInterval:invocation:repeats: 或者 timerWithTimeInterval:target

runloop相关

人走茶凉 提交于 2019-12-26 02:55:51
runloop的相关类: CFRunLoop CFRunLoopMode CFRunLoopTimer CFRunLoopSource CFRunLoopObserve 每一个线程都对应一个runloop 主线程对应的runloop系统自动帮我们创建好了 子线程的runloop需要我们自己手动创建 关于mode: runloop每次只能在一种模式下运行: 模式model有5种:(前2种常用,后3种不怎么使用) NSRunLoopDefaultMode UITrackingRunLoopMode . . . 比如说:定时器设置在default模式下,如果滚动拖曳textview,(切换)启用的是UITrackingRunLoopMode ,此时添加在default模式下的定时器不起作用 为了在滚动模式下定时器也可以使用:可以把定时器添加在占位common模式下,或者把定时器分别添加在2个模式下,让2个模式中都有定时器,这样不管切换到哪个模式下,都可以正常使用 关于timer: NSTimer sche........这个方法启用的定时器可以直接使用 NSTimer*timer=[NSTimer timerin......] 创建对象产生的NSTimer对象,就必须添加到runloop的一种mode模式中才可以正常使用 关于source: source0:是指接收用户触摸的事件源

RunLoop相关知识的总结

≯℡__Kan透↙ 提交于 2019-12-26 02:53:46
RunLoop 即运行循环,也叫事件循环,本质为一个死循环。iOS一个程序运行起来之后,默认会开启一个运行循环,有需要处理的操作时,比如用户的输入事件时,RunLoop会自己跑起来运行,没有需要处理的事件时进入休息休眠的状态,充分节省CPU资源,提高程序的性能。 一、RunLoop的作用: 1.保证程序运行不退出,准确的说是保证线程的不退出,一般一个线程对应一个RunLoop。一个线程的任务执行完毕之后,就会退出,有时候我们需要一个线程随时待命,保持运行的状态不会退出,例如主线程,这就需要RunLoop这样的机制来完成这样的任务。 RunLoop实际上只是一个对象,只是给我们提供了一个函数的入口来执行RunLoop的逻辑。 2.处理app的各种事件:包括输入源和定时源,处理的顺序遵循先进先出的队列顺序。 3.节省CPU资源,优化程序:当没有事件可处理的时候,RunLoop会通知系统,现在没有事情要处理了,可以休息了,系统可以节省出资源去做其他的事情,当有事件要处理的时候,RunLoop立刻运行起来进行处理。 二、RunLoop与线程的关系: 1.一条线程都有与之对应的唯一的RunLoop的对象。 2.RunLoop在第一次获取时创建,在线程运行结束后销毁,只有在线程内部获取到该线程的RunLoop(主线程除外)。 3.主线程的RunLoop自动开启

RunLoop相关知识

北城以北 提交于 2019-12-26 02:51:24
  RunLoop,翻译过来是运行环路。我们在创建命令行项目和创建ios项目时,发现命令行项目当最后一行代码执行完后项目就自动退出了,而ios项目确可以一直运行,知道用户手动点击退出按钮。这就是因为ios项目在main函数中自动创建了runLoop,从而可以使项目可以一直响应用户的操作。 int main(int argc, char * argv[]) { @autoreleasepool { //这行代码 会自动创建主线程的RunLoop return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); } }   我们可以将这个过程我们可以简化成:    我们从这个过程可以看出RunLoop的基本作用  保持程序的持续运行  处理App中的各种事件(比如触摸事件、定时器事件等)  节省CPU资源,提高程序性能:该做事时做事,该休息时休息   ...... 我们平时开发中,涉及到RunLoop的挺多的,比如说定时器、手势识别、网络请求等等,    一、RunLoop的结构 iOS中有2套API来访问和使用RunLoop: ①Foundation: NSRunLoop ,它是基于 CFRunLoopRef 的封装,提供了面向对象的 API,但是这些 API 不是线程安全的。

深入理解RunLoop

旧时模样 提交于 2019-12-25 03:35:48
深入理解RunLoop 由 ibireme | 2015-05-18 | iOS , 技术 RunLoop 是 iOS 和 OSX 开发中非常基础的一个概念,这篇文章将从 CFRunLoop 的源码入手,介绍 RunLoop 的概念以及底层实现原理。之后会介绍一下在 iOS 中,苹果是如何利用 RunLoop 实现自动释放池、延迟回调、触摸事件、屏幕刷新等功能的。 Index RunLoop 的概念 RunLoop 与线程的关系 RunLoop 对外的接口 RunLoop 的 Mode RunLoop 的内部逻辑 RunLoop 的底层实现 苹果用 RunLoop 实现的功能 AutoreleasePool 事件响应 手势识别 界面更新 定时器 PerformSelecter 关于GCD 关于网络请求 RunLoop 的实际应用举例 AFNetworking AsyncDisplayKit RunLoop 的概念 一般来讲,一个线程一次只能执行一个任务,执行完成后线程就会退出。如果我们需要一个机制,让线程能随时处理事件但并不退出,通常的代码逻辑是这样的: 1 2 3 4 5 6 7 function loop() { initialize(); do { var message = get_next_message(); process_message(message); }

NSTimer你真的会用了吗

淺唱寂寞╮ 提交于 2019-12-24 08:56:08
NSTimer你真的会用了吗    看到这个标题,你可能会想NSTimer不就是计时器吗,谁不会用,不就是一个能够定时的完成任务的东西吗?   我想说你知道NSTimer会retain你添加调用方法的对象吗?你知道NSTimer是要加到runloop中才会起作用吗?你知道NSTimer会并不是准确的按照你指定的时间触发的吗?你知道NSTimer就算添加到runloop了也不一定会按照你想象中的那样执行吗?   如果上面提出的哪些问题,你并不全部了解,那么请细心的看完下面的文章,上面的那几个问题我会一一说明,并给出详细的例子。 一、什么是NSTimer    官方给出解释是“A timer provides a way to perform a delayed action or a periodic action. The timer waits until a certain time interval has elapsed and then fires, sending a specified message to a specified object. ” 翻译过来就是timer就是一个能在从现在开始的后面的某一个时刻或者周期性的执行我们指定的方法的对象。 二、NSTimer和它调用的函数对象间到底发生了什么   

iOS Periodically perform a low-priority task while the system is idle

时间秒杀一切 提交于 2019-12-24 07:48:34
问题 In the iOS App development process. I want to periodically perform a low priority task. And do not want this task will affect the main program of work. What is the way to achieve it? Now I use the timer to perform periodical task, but often find the App is not smooth. The low priority task sometime need run on the main thread, such as check pasteboard than display the content on UI. 回答1: You will have to use Blocks(Completion handlers) for this, it's part of GCD. This will stay away from main

MJ_RunLoop

允我心安 提交于 2019-12-19 14:53:08
1.RunLoop对象 iOS中有两套API来访问和使用RunLoop Core Foundation框架:CFRunLoopRef,是开源的 Foundation框架:NSRunLoop,基于CFRunLoopRef的一层OC包装 2.获取RunLoop对象 [NSRunLoop currentRunLoop]; // 获得当前线程的RunLoop对象 CFRunLoopGetCurrent(); // 获得当前线程的RunLoop对象 [NSRunLoop mainRunLoop]; // 获得主线程的RunLoop对象 CFRunLoopGetMain(); // 获得主线程的RunLoop对象 3.RunLoop相关的类 CFRunLoopRef 、CFRunLoopModeRef、CFRunLoopSourceRef 、CFRunLoopTimerRef 、CFRunLoopObserverRef CFRunLoopModeRef 1>CFRunLoopModeRef代表RunLoop的运行模式 2> 一个RunLoop包含若干个Mode,每个Mode又包含若干个Source0/Source1/Timer/Observer 3>RunLoop启动时只能选择其中一个Mode,作为currentMode 4>如果需要切换Mode,只能退出当前Loop