一:常驻线程 :当需要一个线程一直处理一些耗时操作时,可以让它拥有一个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 再次修改)的更多相关文章

  1. 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 ...

  2. ”耐撕“团队 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 ...

  3. 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 ...

  4. Murano Weekly Meeting 2016.06.21

    Meeting time: 2016.June.21 1:00~2:00 Chairperson:  Kirill Zaitsev, from Mirantis Meeting summary: 1. ...

  5. CHAPTER 24 History of Our Planet 第24章 我们行星的历史

    CHAPTER 24 History of Our Planet 第24章 我们行星的历史 Uncovering the bones of ancient beasts is only part of ...

  6. OneZero第一次站立会议&Sprint Planning Meeting(2016.3.21)

    会议时间:2016年3月21日 11:40~12:00 会议成员:冉华,张敏,王巍,夏一鸣. 会议目的:列举第一周工作内容,确定第一周工作分配.即挑选出一个Story作为本次迭代完成的目标. 会议内容 ...

  7. 2016 - 1 - 20 runloop学习(2)

    一:CFRunLoopModeRef 1. CFRunLoopModeRef带表RunLoop的运行模式 2. 一个Runloop可以有若干个mode,每个mode又包含若干个sourse,timer ...

  8. 2016 - 1 - 20 runloop学习

    一:Runloop基本知识 1.本质就是运行循环 2.基本作用: 2.1保证程序持续运行 2.2处理APP中的各种事件:触摸,定时器,selector... 2.3节省CPU资源,系统程序性能:它会让 ...

  9. 2016/12/21 dplの课练

    1.将/etc/passwd第行的最后一段全部改成/bin/bash cat 1 |sed -n '1,$p' |egrep '.*:' -o |sed 's/$/\bin\/bash/' 2.将/e ...

随机推荐

  1. 使用Beanstalkd_console

    作用:可以将 beanstalkd 的队列信息展示在图形化的操作界面一样,这样不仅给我么查看队列信息有很大的帮助,也可以形象地理解队列任务具体内容 使用操作:(前提条件是前面的队列能正常执行,) 首先 ...

  2. ccs6.0使用问题记录

    ccs6.0使用问题记录 彭会锋 1 编译过程中提示warning  " Description Resource Path Location Type #9-D nested commen ...

  3. [redis] redis 存取键值对常用的三种使用方式 - Jedis、JedisPool、Jedis分布式

    |-Jedis 普通方式 |-JedisPool 连接池方式(需要引入pool相关jar) |-Jedis 分布式 (需要引入pool相关jar) 引入jedis2.7.0和commons.pool2 ...

  4. 用过的正则(更新ing)

    http://www.debuggex.com/   这个很好用20120912 //十六进制颜色值的正则表达式 var reg = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6} ...

  5. Linux基础: 挂载镜像文件(Mount & ISO)

    ISO/Ghost 镜像文件概念(裸机安装,无光驱安装,跨平台安装) ISO是镜像文件:所谓镜像文件其实和ZIP压缩包类似,它将特定的一系列文件按照一定的格式制作成单一的文件,以方便用户下载和使用,例 ...

  6. Servlet后续的尾(yi)巴--------Filter过滤器

    -------载录自  http://www.blogjava.net/yangaiyou/archive/2007/08/29/140854.html  感谢博主心如止水 一心向佛 描写出这么的具体 ...

  7. (转载整理)SAP ERP常用表

    abap 常用表 GL部分:FAGLFLEXT(FMGLFLEXT)   新总账汇总表 GLT0        旧总帐汇总表           SKA1        总账科目主记录 (科目表)   ...

  8. 聚类算法:K-means 算法(k均值算法)

    k-means算法:      第一步:选$K$个初始聚类中心,$z_1(1),z_2(1),\cdots,z_k(1)$,其中括号内的序号为寻找聚类中心的迭代运算的次序号. 聚类中心的向量值可任意设 ...

  9. LOOPS(HDU 3853)

    LOOPS Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 125536/65536 K (Java/Others)Total Sub ...

  10. 转载Javascript继承两种形式详解

    一直想对Javascript再次做一些总结,正好最近自己写了一个小型Js UI库,总结了一下Js的继承机制,在网上也看了一些前辈们博客里的总结,感觉分析不是特别全面.这里仅仅是把自己的学习体会拿出来分 ...