Runloop、autoreleasepool的简单理解

本文深入探讨了RunLoop的工作原理及其目的,包括消息循环机制、事件类型及不同模式的作用,并解释了Autorelease如何与RunLoop配合工作,实现内存管理。

1. Runloop

runloop是一种消息循环机制,每一个线程内部都有一个消息循环

只有主线程消息循环默认开启,子线程的消息循环默认不开启

1.1 Runloop的目的

保证程序不退出;

负责处理输入事件;

如果没有事件发生,会让程序进入休眠状态。

1.2 事件类型

Input Sources输入源 & Timer Source定时源;

输入源可以是键盘鼠标;定时源是NSTimer事件。
1.3 mode

(1)kCFRunLoopDefaultMode: App的默认 Mode,通常主线程是在这个 Mode 下运行的。

(2)UITrackingRunLoopMode: 界面跟踪 Mode,用于 ScrollView 追踪触摸滑动,保证界面滑动时不受其他 Mode 影响。

(3)UIInitializationRunLoopMode: 在刚启动 App 时第进入的第一个 Mode,启动完成后就不再使用。

(4)GSEventReceiveRunLoopMode: 接受系统事件的内部 Mode,通常用不到。

(5)kCFRunLoopCommonModes: 这是一个占位的 Mode,没有实际作用。

1.4 子线程中的消息循环

特点:子线程默认不开启消息循环,主线程默认开启消息循环

手动开启注意
执行完[[NSRunLoop currentRunLoop] run];后面的代码不会执行,也关不了循环。

可用[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:5]]; 代替
或(官方推荐用法,作为了解)

2. autoreleasepool

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

 

转载于:https://www.cnblogs.com/gss-blog/p/5881974.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值