Runloop笔记

原文:Runloop基础元素解析 http://www.jianshu.com/p/8b9c81a521bc?utm_campaign=hugo&utm_medium=reader_share&utm_content=note&utm_source=weixin-timeline&from=timeline&isappinstalled=0

作用:保持程序运行,处理各类事件,节省CPU资源提高程序性能、没有事件时就进入休眠状态。

一个Thread对应一个一个runloop,runloop为惰性加载(除了主线程对应的runloop)。

Mode:

一个Runloop可以包涵多个Mode,但是每次RunLoop启动只能指定其中一个Mode。Mode有5中类型分别是CFDefaultRunLoopMode(主线程的默认Mode)、UITrackingRunloopMode(界面跟踪的Mode用于ScrollView追踪触摸滑动)、CFCommonRunLoopMode(占位Mode,并不是真正的Mode)之间可以相互切换。如果想切换只能退出当前Loop再重新定制一个Mode进入。

事件源:(Source\Timer\Observer)

CFRunLoopTimeRef:

基于时间的触发器,一般指NSTimer,包含一个回调函数指针和一个时间长度。

由于NSTimer在RunLoop中处理,受其影响较大,所以有时不准确(可换GCD定时器不受RunLoop影响)。

(1)[NSTimer scheduledTimerWithTimeInterval:]创建一个timer并自动把它制定到一个默认的runloop中去。且只在CFDefaultRunLoopMode模式下能正常运行。

可使用[[NSRunloop mainRunLoop]addTimer:forMode:CFCommonRunLoopMode];对其Mode进行修改。

(2)[NSTimer timerWithTimeInterval:]创建一个timer,这时需要我们手动把它添加到一个runloop中去。

CFRunLoopSourceRef:

分类:

(1)source0:基于port的,Port-Based Source

(2)source1:不基于port的,Custom Input Sources和Cocoa Perform Selector Sources

CFRunLoopObserverRef:

观察者,监听RunLoop状态的变化:

进入、退出RunLoop、即将唤醒、即将进入睡眠、即将处理timer、即将处理Source、所有活动。

RunLoop与自动释放池的关系:

如果看runloop的机制,其实会知道,一个运行循环对应一个线程,而且每个运行循环都会有单独的一个自动释放池,其实自动释放池是寄生于runloop的

在每一个事件周期(event cycle)的开始,系统会自动创建一个自动释放池;在每一个事件周期的结尾,系统会自动销毁这个自动释放池。一般情况下,你可以理解为:当你的代码在持续运行时,自动释放池是不会被销毁的,这段时间内你也可以安全地使用自动释放的对象;当你的代码运行告一段落,开始等待用户输入(或者其它事件)时,自动释放池就会被释放掉,池中的对象都会收到一个release消息,有的可能会因此被销毁。

注意:autoreleasepool是没有单独的内存结构的是通过以autoreleasePoolPage为结点的双向链表实现。

时间: 2024-08-29 02:34:45

Runloop笔记的相关文章

【iOS开发每日小笔记(九)】在子线程中使用runloop,正确操作NSTimer计时的注意点 三种可选方法

这篇文章是我的[iOS开发每日小笔记]系列中的一片,记录的是今天在开发工作中遇到的,可以用很短的文章或很小的demo演示解释出来的小心得小技巧.它们可能会给用户体验.代码效率得到一些提升,或是之前自己没有接触过的技术,很开心的学到了,放在这里得瑟一下.其实,90%的作用是帮助自己回顾.记忆.复习. 一直想写一篇关于runloop学习有所得的文章,总是没有很好的例子.正巧自己的上线App Store的小游戏<跑酷好基友>(https://itunes.apple.com/us/app/pao-k

RunLoop的简单理解笔记

一句话解释RunLoop:运行任务的循环. 为什么要有RunLoop:解决交互式UI设计中的一个问题,如何快速响应用户输入,如何快速将程序运行结果输出到屏幕? 基本原理:1 将任务分解的足够细 2 每个任务运行的时间足够短. 计算机是个笨蛋,同一个时间里只能做同一件事情.要么处理计算任务, 要么轮询各种I/O 接口. 那么,在没有线程的情况下,如何在计算的同时, 又能够轮询各种I/O接口,以迅捷的 和用户交互呢? CS的科学家给出的答案是:看起来够迅捷就行.人的反应速度是有上限的, 因此只要把

iOS Runloop学习笔记

一.* what is run loop * 1.A run loop is an abstraction that (among other things) provides a mechanism to handle system input sources (sockets, ports, files, keyboard, mouse, timers, etc). Each NSThread has its own run loop, which can be accessed via t

[iOS学习笔记]runloop runMode方法调研

  // // ViewController.m // ThreadTest // // Created by skyko on 16/5/31. // Copyright © 2016年 helios. All rights reserved. // #import "ViewController.h" @interface ViewController () @property (nonatomic, strong) NSThread *thread; @property (non

深入理解RunLoop 整理资料

http://blog.ibireme.com/2015/05/18/runloop/#base // RunLoop学习笔记,从CF层面了解由于CFRunLoopMode机制iOS程序ScrollView的滑动为何如此平滑的原因.还有介绍AFNetworking如何单独发起一个global thread内置runloop达到不占用主线程又不耗CPU资源的. // 简单的说run loop是事件驱动的一个大循环,如下代码所示 int main(int argc, char * argv[]) {

iOS学习笔记-精华整理

iOS学习笔记总结整理 一.内存管理情况 1- autorelease,当用户的代码在持续运行时,自动释放池是不会被销毁的,这段时间内用户可以安全地使用自动释放的对象.当用户的代码运行告一段 落,开始等待用户的操作,自动释放池就会被释放掉(调用dealloc),池中的对象都会收到一个release,有可能会因此被销毁. 2-成员属性:     readonly:不指定readonly,默认合成getter和setter方法.外界毫不关心的成员,则不要设置任何属性,这样封装能增加代码的独立性和安全

IOS科研IOS开发笔记学习基础知识

这篇文章是我的IOS学习笔记,他们是知识的基础,在这里,根据记录的查询后的条款. 1,UIScrollView能完毕滚动的功能. 示比例如以下: UIScrollView *tableScrollView; tableScrollView=[[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];//窗体大小 tableScrollView.contentSize=CGSizeMake(640, 480);//设置内容视图的大

GCD 多线程API编程笔记

GCD 是 iOS 编程中实现多线程的常用 API,使用方便,无须进行线程的管理,由系统代劳.同时GCD基于C实现,性能强. 在名著<Pro multithreading and memory management for iOS and OS X>(中文名:<Objective-C 高级编程 iOS与 OSX多线程和内存管理>)中,专门有章节讲解,特根据此书讲解做些笔记. 一 概要 GCD是Grand Central Dispatch(GCD)的缩写,是异步执行任务的技术之一.一

iOS: 学习笔记, performSelectorOnMainThread

- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait performSelectorOnMainThread:withObject:waitUntilDone: 基于默认模式调用主线程中接收器的方法 Invokes a method of the receiver on the main thread using the default mode. 参数 Par