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联系的更多相关文章

  1. RunLoop 和 autoreleasepool

    RunLoop 和 autoreleasepool RunLoop和线程的一一对应的,对应的方式是以key-value的方式保存在一个全局字典中 主线程的RunLoop会在初始化全局字典时创建 子线程 ...

  2. 都在说RunLoop...... 到底什么是RunLoop?

    RunLoop(消息循环):说白了就是一种事件监听循环.就好比是一个while循环,监听到事件就起来,没有就休息. 介绍: 它可以在不同模式下进行切换,iOS有五种模式,其中UIInitializat ...

  3. iOS Runloop 消息循环

    介绍 Runloop是一种事件监听循环,可以理解成一个while死循环,监听到事件就起来,没有就休息. Runloop可以在不同模式下进行切换,iOS有五种模式,其中UIInitializationR ...

  4. iOS开发——高级篇——Runloop相关一

    一.什么是runLoop 1.说白了,runloop就是运行循环 2.runloop,他是多线程的法宝 通常来讲,一个线程一次只能执行一个任务,执行完之后就退出线程.但是,对于主线程是不能退出的,因此 ...

  5. runloop 小记

    一.什么是runLoop 1.说白了,runloop就是运行循环 2.runloop,他是多线程的法宝 通常来讲,一个线程一次只能执行一个任务,执行完之后就退出线程.但是,对于主线程是不能退出的,因此 ...

  6. iOS面试题 -总结 ,你的基础扎实吗?

    1.#import和#include的区别,@class代表什么? (1)#import指令是Object-C针对#include的改进版本,#import确保引用的文件只会被引用一次,这样你就不会陷 ...

  7. iOS 面试题搜集

    1.#import和#include的区别,@class代表什么? 2.浅拷贝和深拷贝区别是什么? 3.Objective-C中类别和类扩展的区别? 4.Objective-C堆和栈的区别? 5.内存 ...

  8. BAT面试的准备—iOS篇

    本文主要用于记录在准备BAT面试中关于iOS遇到的问题和做一些相关面试题的笔记 iOS网络层设计 1.网络层和业务层的对接设计 使用哪种交互模式来和业务层对接 : 使用Delegate为主,目的是为了 ...

  9. RunLoop 总结:RunLoop的应用场景(一)

    参考资料 好的书籍都是值得反复看的,那好的文章,好的资料也值得我们反复看.我们在不同的阶段来相同的文章或资料或书籍都能有不同的收获,那它就是好文章,好书籍,好资料.关于iOS 中的RunLoop资料非 ...

随机推荐

  1. Redis简介与简单安装

    Redis简介与简单安装   一.NoSQL的风生水起 1.1 后Web2.0时代的发展要求 随着互联网Web2.0网站的兴起,传统的关系数据库在应付Web2.0网站,特别是超大规模和高并发的SNS类 ...

  2. Azure China

    Azure China   Azure China (2) Azure China管理界面初探 摘要: <Windows Azure Platform 系列文章目录> 首先是Q&A ...

  3. Web Api的安全性

    Web Api的安全性 系列导航地址http://www.cnblogs.com/fzrain/p/3490137.html 前言 这一篇文章我们主要来探讨一下Web Api的安全性,到目前为止所有的 ...

  4. iOS基础 - UITableViewController

    1. 继承UITableViewController默认会设置数据源和代理,并且会自动遵守数据源和代理协议,并且self.tableView 相当于 self.view 2.更换控制器时,注意把sto ...

  5. github 出现 Permission denied (publickey)的解决

    从github上clone的时候出现了以下错误 应该是ssh key过期了,试着重新创建ssh key,按以下步骤 1.  注意短横线前后都没有空格 接着一切都默认,它会在把ssh key 储存在 C ...

  6. 分享Syslinux4USB 0.3源码——改自神雕大侠作品

    神雕大侠写的Syslinux4USB是我在无忧论坛里找到的工具,他是2011年写出的,他在帖子里也发布了源码,可惜那个帖子里的链接失效了,我为了这个工具的源码找了2年,终于在Google上搜到了,并且 ...

  7. linux 之 popen函数

    描述 popen() 函数 用 创建管道 的 方式启动一个 进程, 并调用 shell. 因为 管道是被定义成单向的, 所以 type 参数 只能定义成 只读或者 只写, 不能是 两者同时, 结果流也 ...

  8. MyEclipse修改默认的workspace路径

    在此只提供一个自己认为可行的办法(已验证可行) 已MyEclipse8.5为例 打开安装路径C:\Program Files\Genuitec\MyEclipse 8.5\configuration下 ...

  9. WPF 自定义 MessageBox (相对完善版)

    WPF 自定义 MessageBox (相对完善版)     基于WPF的自定义 MessageBox. 众所周知WPF界面美观.大多数WPF元素都可以简单的修改其样式,从而达到程序的风格统一.可是当 ...

  10. 纯Python综合图像处理小工具(2)图像增强

    <背景> 这次分享的脚本是对图像进行增强处理,包含对图像像素的色彩增强.亮度增强.对比度增强.图像尖锐化等增强操作,主要基于PIL包的lambda和ImageEnhance模块. 使用方法 ...