Runloop与autoreleasePool联系
autoreleasePool自动释放池,ARC模式下,苹果会自动进行内存管理,不需要我们手动去管理内存。这对于苹果开发者来说,省去了很多事情,不用再每天为了内存管理浪费掉宝贵的开发时间。大家都知道,在我们开发的ARC项目中,苹果会在合适的地方添加autoreleasePool,从而retain或者release对象。那么,请问:autoreleasePool在什么时机创建,在什么时机去释放呢?回答:这事只有ARC知道,我们开发者不知道。这种答案是不是很low呢?接下来,根据Runloop的运行机制,解释一下autoreleasePool到底是什么时机创建和释放。
当程序运行时,会有多条线程去执行进程中的任务,每个线程对应一个Runloop,实现原理是创建一个全局字典,key是线程对象,value是Runloop对象,从而线程和Runloop会一一对应。
Runloop内部结构图:我的理解,Mode其实是对Runloop内部结构的分组,一个Runloop包括多个Mode,每个Mode里面又包括source(事件源),
Observe(监听),Timer(定时源)。
autoreleasePool创建与释放时机与Observer相关.Observer是runloop执行任务的回调。
typedef CF_OPTIONS(CFOptionFlags, CFRunLoopActivity) {
kCFRunLoopEntry = (1UL << 0), //当进入runloop循环的时候,会执行对应的回调
kCFRunLoopBeforeTimers = (1UL << 1),//当执行定时源事件之前,会执行对应的回调
kCFRunLoopBeforeSources = (1UL << 2),//当执行source事件之前,会执行对应的回调
kCFRunLoopBeforeWaiting = (1UL << 5),//当runloop睡眠之前,会执行对应的回调
kCFRunLoopAfterWaiting = (1UL << 6),//当runloop睡眠之后,会执行对应的回调
kCFRunLoopExit = (1UL << 7),//当退出runloop,会执行对应的回调事件
kCFRunLoopAllActivities = 0x0FFFFFFFU
};
那么,我们来看看Main Runloop是在什么时机来处理autoreleasePool的!
Main Runloop里面对于autorelease的处理回调,那么,我们接下来分析回调的地方:
1。activities其实就是事件执行的时机,这里的activity对应的是kCFRunLoopEntry。当开启或者唤醒runloop的时候,会创建一个autoreleasePool;
2.这里的activity 0xa0 = 1010 0000 kCFRunLoopBeforeWaiting | kCFRunLoopExit当runloop睡眠之前或者退出runloop的时候会释放autoreleasePool;
总结:根据Runloop的运行机制,解释一下autoreleasePool到底是什么时机创建和释放?
回答:当开启或者唤醒runloop的时候,会创建一个autoreleasePool;kCFRunLoopBeforeWaiting | kCFRunLoopExit当runloop睡眠之前或者退出runloop的时候会释放autoreleasePool;
这是我对Runloop与autoreleasePool联系的见解,其中有错误的地方或者大家不明白的地方,请评论中提出不足点,感谢大家支持。
-----------------以下和autoreleasePool没有关系---------
Runloop是如何实现睡眠和唤醒的呢?这就要从OSX和iOS操作系统来分析了,OSX和iOS操作系统分为两大部分,分别是应用层和内核层。应用层中的应用程序包括很多线程,每个线程会通过mach_msg向内核层发送消息,内核层会把消息添加到cpu处理的消息队列中,等待cpu处理。当线程发送mach_msg()消息时,是告诉cpu我没有任务要处理了,我要进行休眠了。这时,该线程就不会浪费cpu资源了。但是线程会告诉cpu,如果有任务需要我来处理的时候,cpu要给我发送消息,把我唤醒,然后我来处理任务。大家要知道,内核层包括cpu,硬盘,摄像头,鼠标键盘灯输入设备,所以当用户与界面交互的时候,交互事件是从内核向上抛给应用程序的,结构图如下:
Runloop与autoreleasePool联系的更多相关文章
- RunLoop 和 autoreleasepool
RunLoop 和 autoreleasepool RunLoop和线程的一一对应的,对应的方式是以key-value的方式保存在一个全局字典中 主线程的RunLoop会在初始化全局字典时创建 子线程 ...
- 都在说RunLoop...... 到底什么是RunLoop?
RunLoop(消息循环):说白了就是一种事件监听循环.就好比是一个while循环,监听到事件就起来,没有就休息. 介绍: 它可以在不同模式下进行切换,iOS有五种模式,其中UIInitializat ...
- iOS Runloop 消息循环
介绍 Runloop是一种事件监听循环,可以理解成一个while死循环,监听到事件就起来,没有就休息. Runloop可以在不同模式下进行切换,iOS有五种模式,其中UIInitializationR ...
- iOS开发——高级篇——Runloop相关一
一.什么是runLoop 1.说白了,runloop就是运行循环 2.runloop,他是多线程的法宝 通常来讲,一个线程一次只能执行一个任务,执行完之后就退出线程.但是,对于主线程是不能退出的,因此 ...
- runloop 小记
一.什么是runLoop 1.说白了,runloop就是运行循环 2.runloop,他是多线程的法宝 通常来讲,一个线程一次只能执行一个任务,执行完之后就退出线程.但是,对于主线程是不能退出的,因此 ...
- iOS面试题 -总结 ,你的基础扎实吗?
1.#import和#include的区别,@class代表什么? (1)#import指令是Object-C针对#include的改进版本,#import确保引用的文件只会被引用一次,这样你就不会陷 ...
- iOS 面试题搜集
1.#import和#include的区别,@class代表什么? 2.浅拷贝和深拷贝区别是什么? 3.Objective-C中类别和类扩展的区别? 4.Objective-C堆和栈的区别? 5.内存 ...
- BAT面试的准备—iOS篇
本文主要用于记录在准备BAT面试中关于iOS遇到的问题和做一些相关面试题的笔记 iOS网络层设计 1.网络层和业务层的对接设计 使用哪种交互模式来和业务层对接 : 使用Delegate为主,目的是为了 ...
- RunLoop 总结:RunLoop的应用场景(一)
参考资料 好的书籍都是值得反复看的,那好的文章,好的资料也值得我们反复看.我们在不同的阶段来相同的文章或资料或书籍都能有不同的收获,那它就是好文章,好书籍,好资料.关于iOS 中的RunLoop资料非 ...
随机推荐
- js理解
js-提前声明和new操作符理解 1.提前声明:声明变量后,js会把声明部分提前到作用域前面. var a=1; function aheadOfStatement(){ alert(a); va ...
- Jquery Validate 表单验证的多种方式
ASP.NET MVC Jquery Validate 表单验证的多种方式 在我们日常开发过程中,前端的表单验证很重要,如果这块处理不当,会出现很多bug .但是如果处理的好,不仅bug会很少,用户体 ...
- Windows服务小技巧
Windows服务小技巧 阅读目录 开始 将Windows服务转变为控制台程序 注册服务为自动启动服务 注册服务时设置服务的依赖关系 添加自定义命令行参数 自定义命令行参数演示 系列链接 伴随着研究W ...
- 捆绑(Bundle)
捆绑(Bundle) 本文介绍 MVC 4 提供的一个新特性:捆绑(Bundle),一个在 View 和 Layout 中用于组织优化浏览器请求的 CSS 和 JavaScript 文件的技术. 本 ...
- c# 服务程序重启自身
由于工作有这样的需求,于是各种寻找,但是都不满意,偶然间想起一个方法 1.修改服务的Program.cs文件如下 static void Main(string[] args) { //LoadFil ...
- 一个HttpWebRequest工具类
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.N ...
- django安装配置及测试
django安装之前我们假设你已经安装了python,和mysql(不是必须的):(如果没有google一下挺简单不介绍了)下面直接介绍django的安装配置:到下面连接可以下载www.djangop ...
- 企业架构研究总结(25)——TOGAF架构开发方法(ADM)之迁移规划阶段
1.8 迁移规划(Migration Planning) 企业架构开发方法各阶段——迁移规划 1.8.1 目标 本阶段的目标是: 确保实施和迁移规划与企业中各种管理框架相协调. 通过对每个进行中的成本 ...
- jQuery中,$.extend,$obj.extend和$.fn.extend三者的区别
jQuery中,$.extend,$obj.extend和$.fn.extend三者的区别 现在做的一个项目,所使用的框架是基于jQuery扩展的,于是平时学了一下jQuery,了解到了它的扩展函数: ...
- Redis几个认识误区
前几天微博发生了一起大的系统故障,很多技术的朋友都比较关心,其中的原因不会超出James Hamilton在On Designing and Deploying Internet-Scale Serv ...