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

时间: 2024-10-22 09:50:47

Runloop与autoreleasePool联系的相关文章

NSRunLoop、RunLoop和AutoreleasePool

1.NSRunloop NSRunloop是一种消息循环机制,它会侦测输入源(input source)和定时源(timer source),然后做回调处理.主要作用使线程在没有任何事件处理的时候处于休眠状态,对于非主线程而言,可以防止线程在等候指令时候被杀掉(NSTimer调用).其原理图如下: 每个线程都有一个默认的NSRunloop.主线程的NSRunloop默认是运行的.非主线程的NSRunloop默认是没有运行的,需要为NSRunloop添加一个事件,然后去run. 2.runloop

iOS开发-RunLoop总结

序言 在<iOS之应用程序启动过程及原理总结>一篇中介绍了iOS应用的启动原理.我们知道当应用启动后,系统会自动创建一个线程来执行任务,该线程被称为主线程或者UI线程.其实在主线程创建的时候,系统还会为主线程创建并启动一种机制(其实就是一个对象,该对象和应用的生命周期有关),叫做RunLoop,被称为运行循环机制.本文主要将介绍iOS应用中的RunLoop机制. RunLoop简介 RunLoop概念 提到RunLoop,我们一般都会提到线程,这是为什么呢?先来看下 官方对 RunLoop 的

利用runLoop加载高清大图

一.什么是runLoop 1.说白了,runloop就是运行循环 2.runloop,他是多线程的法宝 通常来讲,一个线程一次只能执行一个任务,执行完之后就退出线程.但是,对于主线程是不能退出的,因此我们需要让主线程即使任务执行完毕,也可以继续等待接收事件而不退出,那么runloop就可以做到. 但是非主线程通常来说就是为了执行某一任务的,执行完毕就需要归还资源,因此默认是不运行runloop的. 3.每一个线程对应都有一个runloop,只是默认只有主线程的runloop是开启的,其他子线程的

BAT面试的准备—iOS篇

本文中的所有面试题都来自面试BAT的学长或者同学给我的一手记录,我将这些题目罗列并给予解答,一方面当做笔记,另一方面造福大家 iOS网络层设计 1.网络层和业务层的对接设计 使用哪种交互模式来和业务层对接 : 使用Delegate为主,目的是为了(1)减少代码的分散度(2)减少业务层和网络层的耦合,网络层对于业务层应该是抽象的,隐藏了实现细节的 (3)只采用一种是限制了灵活性,方便进行维护 在网络层不要滥用block :(1)block会延长对象的生命期,delegate则不会(2)block适

iOS面试笔记(2)

一.为什么在使用部分第三方SDK中block回调不需要使用weakSelf,例如AFN AFN在封装的时候,重写了setCompletionBlock方法,在回调后直接将completionBlock置为nil,打破了循环引用 二.Block为什么要用copy来修饰 默认情况下,block是存档在栈中,出了作用域就会被回收,再去调用将会crash,通过copy操作可以使其在堆中保留一份,保证能被访问. 三.消息推送流程是怎样,devicetoken怎么来的 1.应用程序通过方法 - (void)

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

1.#import和#include的区别,@class代表什么? 2.浅拷贝和深拷贝区别是什么? 3.Objective-C中类别和类扩展的区别? 4.Objective-C堆和栈的区别? 5.内存管理的几个原则是什么? 6.NSMuatableArray *array = [NSMuatableArray array] 需要释放么? 7.@property本质是什么 8.delegate用什么属性修饰,ARC下与MRC下有何不同,为什么? 9.NSString,NSArray,NSMutab

【iOS程序启动与运转】- RunLoop个人小结

学习iOS开发一般都是从UI开始的,从只知道从IB拖控件,到知道怎么在方法里写代码,然后会显示什么样的视图,产生什么样的事件,等等.其实程序从启动开始,一直都是按照苹果封装好的代码运行着,暴露的一些属性和方法作为接口,是让我们在给定的方法里写代码实现自定义功能,做出各种各样的应用.这些方法的调用顺序最为关键,熟悉了程序运转和方法调用的顺序,才可以更好地操控程序和代码,尽量避免Xcode不报错又实现不了功能的BUG.从Xcode的线程函数调用栈可以看到一些方法调用顺序. 0 从程序启动开始到vie

iOS RunLoop了解和使用

RunLoop 上次讲了runtime,这次是runloop,虽然两者都是run开头的名词术语,但是在OC中,这两个东西压根没啥联系.这篇文章主要讲讲runloop的一些概念和用法.其中包含: 什么runloop runloop是怎么存在的 runloop中包含哪些东西 日常开发中使用到runloop 的场景 一.什么是runloop 一个很容易想到的现象: 当我们将手机解锁进入某个APP之后,如果不操作手机(包括网络请求的行为),手机不会有任何反应,一旦我们进行了操作的时候,手机就会执行响应的

深入理解Runloop,看我一篇就够了

前言 RunLoop 是 iOS 和 OSX 开发中非常基础的一个概念,为了让大家更加快速融入,请先一段代码: + (NSThread *)networkRequestThread { static NSThread *_networkRequestThread = nil; static dispatch_once_t oncePredicate; dispatch_once(&oncePredicate, ^{ _networkRequestThread = [[NSThread alloc