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,硬盘,摄像头,鼠标键盘灯输入设备,所以当用户与界面交互的时候,交互事件是从内核向上抛给应用程序的,结构图如下:

转载于:https://www.cnblogs.com/xiaobai51/p/5885598.html

Runloop与autoreleasePool联系相关推荐

  1. [iOS开发]@autoreleasepool原理探究

    自动释放池 自动释放池 @autoreleasepool 最常见的地方就是我们项目的 main函数 .我们今天来深入探索下其底层结构和实现原理.先查看一下编译后的情形: int main(int ar ...

  2. OC Autorelease

    @implementation ViewController - (void)viewDidLoad {[super viewDidLoad];__unsafe_unretained NSObject ...

  3. Objective-C runtime机制(5)——iOS 内存管理

    概述 当我们创建一个对象时: SWHunter *hunter = [[SWHunter alloc] init]; 上面这行代码在栈上创建了hunter指针,并在堆上创建了一个SWHunter对象. ...

  4. iOS开发笔记之八十一——2020 iOS面试总结《一》之干货篇

    ******阅读完此文,大概需要5分钟****** 这是我毕业之后第三次开始找工作了,适逢2019年底,我清楚地知道,iOS开发已经不是很景气了,尽管自己有名校以及大厂背景,但是自己一点都没有把握,自 ...

  5. iOS 内存管理机制与原理

    内存分区 内存一般分为五大区:栈区.堆区.常量区.全局区.代码区.如图 1.栈区 是由编译器自动分配并释放的,主要用来存储局部变量.函数的参数等,是一块连续的内存区域,遵循先进后出(FILO)原则.一 ...

  6. 在ARC环境中autoreleasepool(runloop)的研究

    引言 最近有个大佬考察了我关于autoreleasepool的了解, 之前一直认为自己了解, 但是稍微一问深, 自己却哑口无言. 仔细思考了下, 决定要将这个问题结合之前的知识从新梳理一下, 当然, ...

  7. 2016 - 1- 21 - RunLoop使用(2016-1-24修改一次)(2016 - 1 - 24 再次修改)

    一:常驻线程 :当需要一个线程一直处理一些耗时操作时,可以让它拥有一个RunLoop.具体代码如下:    1.通过给RunloopMode里加源来保证RunLoop不直接退出. 这里有个很重要得知识 ...

  8. iOS RunLoop详解

    一.简介 CFRunLoopRef源码 RunLoop是一个对象,这个对象在循环中用来处理程序运行过程中出现的各种事件(比如说触摸事件.UI刷新事件.定时器事件.Selector事件),从而保持程序的 ...

  9. @AUTORELEASEPOOL

    Swift 在内存管理上使用的是自动引用计数 (ARC) 的一套方法,在 ARC 中虽然不需要手动地调用像是 retain,release 或者是 autorelease 这样的方法来管理引用计数,但 ...

  10. RunLoop 浅析

    RunLoop 浅析 一个小应用 首先我们需要编写一个应用,这个小应用的要求很简单:它需要执行一些比较耗时的操作,在执行耗时操作的同时还需要可以继续响应用户的操作. 那么首先想到的就是使用两个线程,一 ...

最新文章

  1. xcode升级xcode9 1之后报错swift stdlib tool error
  2. MySql之DDL操作创建表(添加主键, 外键约束以及基本的数据类型)
  3. STM32 中断详解
  4. 浙江大学_包家立教授计算生物学2_信源编码理论
  5. jsp java mysql_jsp java mysql
  6. 【2022美赛F奖】B题:水电共享
  7. 计算机查看图片的打开方式,win7系统图片打开方式没有windows照片查看器的解决步骤...
  8. Vue-Waterfall-Easy插件详细使用教程
  9. 开源知识管理系统_半个月收获接近 1k 的点赞!你需要的开源项目都在这里
  10. 【2021杭电多校赛】2021“MINIEYE杯”中国大学生算法设计超级联赛(8)
  11. meiyouyingjian------cnclsnvcnsdnvk
  12. C# #region简单使用
  13. Oracle--“ORA-28007: the password cannot be reused”解决
  14. python绘制曲线、散点图
  15. 软件工程导论患者监护系统可行性研究
  16. 计算机睡眠打印机不能用,计算机打印机不能用怎么办?
  17. 关于何如在英伟达官网上下载历史驱动的方法
  18. iOS开发底层之KVO探索下 -18
  19. 【iKcamp线下】微信小程序技术沙龙
  20. 小啊呜产品读书笔记001:《邱岳的产品手记-01》 阅读计划内容简介

热门文章

  1. redhat enterprise linux5.4.iso,版本有RedHat Enterprise Linux(RHEL)5.4/5.5/5.8/6.0/6.3 ISO镜像文件下载地址...
  2. linux 通知线程退出,[Linux线程]多线程的阻塞和退出
  3. java 内存泄漏问题_Java内存泄露的理解与解决(转)
  4. java 运动_java web 运动前端
  5. python只保留大写字母_python - 匹配某一行并保留大写字母?
  6. bootstrap居中
  7. 【UML】概念、关联、画画(一)
  8. 判断请求是通过点击链接还是直接输入网址
  9. MySQL left join right join inner join 区别
  10. 2月11日 TensorBoard+DNN+CNN