NSRunLoop、RunLoop和AutoreleasePool

1、NSRunloop

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

每个线程都有一个默认的NSRunloop。主线程的NSRunloop默认是运行的。非主线程的NSRunloop默认是没有运行的,需要为NSRunloop添加一个事件,然后去run。

2、runloop

那什么是一个runloop?一个UI事件,一个timer,一个系统delegate都称之为runloop(不是NSRunloop),runloop实际上是从接收消息,然后处理完消息的一个完整过程。

3、autoreleasePool

autorelease本质上是延迟释放,延迟调用release(当autoreleasePool中对象的引用计数都为1的调用release),对于每一个Runloop, 系统会隐式创建一个Autorelease pool,这样所有的release pool会构成一个象CallStack一样的一个栈式结构,对象会自动被放入栈顶的AutoreleasePool中,在每一个Runloop结束时,当前栈顶的Autorelease pool会被销毁,这样这个pool里的每个Object会被release。只有以上提到了3种runloop才会自动创建autorelease pool,thread是不会自动创建的。

4、为什么对象在被释放前,打印出来的retainCount为1而不为0?

当对象最后一次执行release时,系统知道马上就要回收内存了,就没有必要再将retainCount减1了,因为不管减不减1,该对象都肯定会被回收,而对象被回收后,它的所有的内存区域,包括retainCount值也变得没有意义。不将这个值从1变成0,可以减少一次内存的操作,加速对象的回收。

参考:《iOS开发进阶》

zyy的专栏

时间: 2024-08-25 05:23:41

NSRunLoop、RunLoop和AutoreleasePool的相关文章

Runloop与autoreleasePool联系

autoreleasePool自动释放池,ARC模式下,苹果会自动进行内存管理,不需要我们手动去管理内存.这对于苹果开发者来说,省去了很多事情,不用再每天为了内存管理浪费掉宝贵的开发时间.大家都知道,在我们开发的ARC项目中,苹果会在合适的地方添加autoreleasePool,从而retain或者release对象.那么,请问:autoreleasePool在什么时机创建,在什么时机去释放呢?回答:这事只有ARC知道,我们开发者不知道.这种答案是不是很low呢?接下来,根据Runloop的运行

【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

[ios 程序启动与运转] - RunLoop个人小结

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

iOS runloop详解

写这篇文章开始之前,我都不知道runloop是什么东西,如果从字面的意思翻译应该是一直循环的跑,怀疑可能和死锁有关系,可是死锁具体是怎么回事,我只是记得有这个说法,也发现了一个自己不懂的知识. 初识runloop 我在网上看了一下@sunnnyxx 关于runloop的视频.了解了一下runloop相关知识,也去网络上看各种关于runloop的讲述. 我们一般程序就是执行一个线程,是一条直线,有起点终点,而runloop就是一直在线程上面画圆圈,一直在跑圈,除非切断否则一直在运行.网上说的比喻很

李洪强iOS开发之RunLoop的原理和核心机制

李洪强iOS开发之RunLoop的原理和核心机制 搞iOS之后一直没有深入研究过RunLoop,非常的惭愧.刚好前一阵子负责性能优化项目,需要利用RunLoop做性能优化和性能检测,趁着这个机会深入研究了RunLoop的原理和特性. RunLoop的定义 当有持续的异步任务需求时,我们会创建一个独立的生命周期可控的线程.RunLoop就是控制线程生命周期并接收事件进行处理的机制. RunLoop是iOS事件响应与任务处理最核心的机制,它贯穿iOS整个系统. Foundation: NSRunLo

iOS runtime和runloop

runtime 和 runloop 作为一个程序员进阶是必须的,也是非常重要的, 在面试过程中是经常会被问到的, 所以大家有必要进行研究,有能力的童鞋可以和下面作者一样, 亲历实践一下. 在简书里发现了两篇非常好的文章介绍 runtime和runloop的,在这里合二为一了, 把原版作者的东西拿了过来, 为了尊重作者,在这里注明一下 @sam_lau 是runtime的作者, @tripleCC是runloop的作者   RunTime Objective-C是基于C语言加入了面向对象特性和消息

深入理解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[]) {