2016 - 1- 21 - RunLoop使用(2016-1-24修改一次)&(2016 - 1 - 24 再次修改)
一:常驻线程 :当需要一个线程一直处理一些耗时操作时,可以让它拥有一个RunLoop。具体代码如下:
1.通过给RunloopMode里加源来保证RunLoop不直接退出。
这里有个很重要得知识点,runloop对象如果mode为空得话,会直接返回。在下面这段代码中的run方法里:
[[NSRunLoop currentRunLoop] addPort:[NSPort port] forMode:NSDefaultRunLoopMode]; // 给RunLoop的Mode里添加内容
[[NSRunLoop currentRunLoop] run];// 开启RunLoop,默认是出于Default模式。
保证RunLoop对象的mode不会为空,也就是不会直接退出,保证线程持续运行。
@interface ViewController ()
@property (nonatomic, strong) ZZThread *testThread; @end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad]; // 创建自己的线程,并让其执行run方法
ZZThread *thread = [[ZZThread alloc] initWithTarget:self selector:@selector(run) object:nil];
self.testThread = thread;
[self.testThread start]; }
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
[self performSelector:@selector(test) onThread:self.testThread withObject:nil waitUntilDone:NO ];
}
- (void)test{
NSLog(@"%s ------- %@",__func__,[NSThread currentThread]);
}
// 给线程添加一个RunLoop 让线程"Live"
- (void)run
{
NSLog(@"%s -------------- %@",__func__,[NSThread currentThread]); // 如果RunLoop的Mode内没有内容,RunLoop会被直接销毁
[[NSRunLoop currentRunLoop] addPort:[NSPort port] forMode:NSDefaultRunLoopMode]; // 给RunLoop的Mode里添加内容 [[NSRunLoop currentRunLoop] run];// 开启RunLoop,默认是出于Default模式。 NSLog(@"-------------run end -----------");// 正面run方法一直没有结束 } @end
2.给Runloop中添加定时器也可以保证RunLoop直接退出。
- (void)viewDidLoad {
[super viewDidLoad];
// 创建自己的线程,并让其执行run方法
ZZThread *thread = [[ZZThread alloc] initWithTarget:self selector:@selector(test2) object:nil];
self.testThread = thread;
[self.testThread start];
}
- (void)test2{
NSTimer *timer = [NSTimer timerWithTimeInterval: target:self selector:@selector(test) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode ];
[[NSRunLoop currentRunLoop] run];
}
- (void)test{
NSLog(@"%s ------- %@",__func__,[NSThread currentThread]);
}
二:自动释放池
1.RunLoop的自动释放池的生命周期

RunLoop在开始步骤1时会创建自动释放池,并将之后的需要创建的临时对象都放在池子里,然后在步骤6的时候会将池子销毁,也就是对所有对象做一次realease操作。
也就是说RunLoop每跑一圈,到休眠这个周期里,自动释放池的生命周期同时也是从创建到销毁。
2016-1-24补充:
Runloop内部是通过注册一个Observer监听RunLoop的状态,当监听到RunLoop的状态为before waiting时,就会释放自动释放池。(kCFRunLoopBeforeWaiting)
需要注意的是,Observer也会在这个时候在执行完销毁自动释放池的操作后,再创建一个自动释放池,而不是在步骤1。
也就是说RunLoop中的自动释放池都是在步骤6中销毁与创建的!!!
2016 - 1- 24 16:00再次补充:
可以打印出Runloop对象,发现它内部监听自动释放池的obserer对象的activities的值为1和160(32 + 128)
也就是说observer对象其实监听了Runloop的三个状态:kCFRunLoopEntry,kCFRunLoopBeforeWaiting,kCFRunLoopExit
kCFRunLoopEntry:Runloop的进入状态,此时会第一次创建自动释放池
kCGRunLoopBeforeWaiting: RunLoop的休眠状态前,此时会销毁第一次在进入时创建的自动释放池并又创建一个新的自动释放池。
kCFRunLoopExit: 直接销毁自动释放池
2.所以在创建RunLoop对象时应该也用一个自动释放池包住
// 给线程添加一个RunLoop 让线程"Live"
- (void)run
{
@autoreleasepool { NSLog(@"%s -------------- %@",__func__,[NSThread currentThread]); // 如果RunLoop的Mode内没有内容,RunLoop会被直接销毁
[[NSRunLoop currentRunLoop] addPort:[NSPort port] forMode:NSDefaultRunLoopMode]; // 给RunLoop的Mode里添加内容 [[NSRunLoop currentRunLoop] run];// 开启RunLoop,默认是出于Default模式。 NSLog(@"-------------run end -----------");// 正面run方法一直没有结束 } }
2016 - 1- 21 - RunLoop使用(2016-1-24修改一次)&(2016 - 1 - 24 再次修改)的更多相关文章
- FFMpeg ver 20160219-git-98a0053 滤镜中英文对照 2016.02.21 by 1CM
FFMpeg ver 20160219-git-98a0053 滤镜中英文对照 2016.02.21 by 1CM T.. = Timeline support 支持时间轴 .S. = Slice t ...
- ”耐撕“团队 2016.3.21 站立会议3 2 1 GO!
”耐撕“团队 2016.3.21 站立会议 时间:2016.3.21 ① 17:20-17:45 ②17:55-18:10 总计40分钟 成员: Z 郑蕊 * 组长 (博客:http://www ...
- Technical Committee Weekly Meeting 2016.06.21
Meeting time: 2016.June.21 1:00~2:00 Chairperson: Thierry Carrez Meeting summary: 1.Add current hou ...
- Murano Weekly Meeting 2016.06.21
Meeting time: 2016.June.21 1:00~2:00 Chairperson: Kirill Zaitsev, from Mirantis Meeting summary: 1. ...
- CHAPTER 24 History of Our Planet 第24章 我们行星的历史
CHAPTER 24 History of Our Planet 第24章 我们行星的历史 Uncovering the bones of ancient beasts is only part of ...
- OneZero第一次站立会议&Sprint Planning Meeting(2016.3.21)
会议时间:2016年3月21日 11:40~12:00 会议成员:冉华,张敏,王巍,夏一鸣. 会议目的:列举第一周工作内容,确定第一周工作分配.即挑选出一个Story作为本次迭代完成的目标. 会议内容 ...
- 2016 - 1 - 20 runloop学习(2)
一:CFRunLoopModeRef 1. CFRunLoopModeRef带表RunLoop的运行模式 2. 一个Runloop可以有若干个mode,每个mode又包含若干个sourse,timer ...
- 2016 - 1 - 20 runloop学习
一:Runloop基本知识 1.本质就是运行循环 2.基本作用: 2.1保证程序持续运行 2.2处理APP中的各种事件:触摸,定时器,selector... 2.3节省CPU资源,系统程序性能:它会让 ...
- 2016/12/21 dplの课练
1.将/etc/passwd第行的最后一段全部改成/bin/bash cat 1 |sed -n '1,$p' |egrep '.*:' -o |sed 's/$/\bin\/bash/' 2.将/e ...
随机推荐
- cookie ,session Storage, local storage
先来定义: cookie:是网站为了标识用户身份存储在本地终端的数据,其数据始终在APP请求中存在,会在服务器和浏览器中来回传递 数据大小不超过4k, 可以设置有效期,过了有效期自动删除 sessio ...
- js 返回上一页和刷新
1. Javascript 返回上一页history.go(-1), 返回两个页面: history.go(-2); 2. history.back(). 3. window.history.forw ...
- 5.3.2 Eclipse集成开发环境的使用技巧
Eclipse具有强大的编辑.调试.编译和打包功能,本节仅讲解Eclipse中最常用的功能. 1.将程序代码和注释字体变大 (1)启动Eclipse,选择“Windows”->“Preferen ...
- 关于iOS7 设计师需要了解的十件事
在今年的WWDC上,苹果推出了采用全新设计语言打造的iOS7.新系统弃用了诸如皮革.木质一类的伪3D拟真效果,取而代之的是更加简洁轻量的设计路线,其中文字排版成了重头戏,另外在某些方面也受到了扁平化设 ...
- 如何使用Vbox添加虚拟机
简介 :vbox是oracle旗下的一个免费的虚拟机软件. 个人感觉操作方便,至少比VM要好用的多. 如果有已经制作好的 点击下一步: 下一步 找到之后 创建 look
- hdu-------(1848)Fibonacci again and again(sg函数版的尼姆博弈)
Fibonacci again and again Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Jav ...
- 使用Node.js实现数据推送
业务场景:后端更新数据推送到客户端(Java部分使用Tomcat服务器). 后端推送数据的解决方案有很多,比如轮询.Comet.WebSocket. 1. 轮询对于后端来说开发成本最低,就是按照传统的 ...
- script "text/template"
<script type="text/template" id="orgItem"> <div class="{orgClass}& ...
- 在Linux下安装aws命令行操作
使用安装包安装 环境: Linux, OS X, or Unix Python 2 version 2.6.5+ or Python 3 version 3.3+ 检查Python版本 $ pytho ...
- 328. Odd Even Linked List——多利用fake_head
Given a singly linked list, group all odd nodes together followed by the even nodes. Please note her ...