一:常驻线程 :当需要一个线程一直处理一些耗时操作时,可以让它拥有一个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:2 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方法一直没有结束
        }}

转载于:https://www.cnblogs.com/BJTUzhengli/p/5148992.html

2016 - 1- 21 - RunLoop使用(2016-1-24修改一次)(2016 - 1 - 24 再次修改)相关推荐

  1. iOS 最新App提交上架流程及部分问题的解决方案2016.12.21,感谢原博主!!!

    iOS 最新App提交上架流程及部分问题的解决方案2016.12.21,感谢原博主!!! 参考文章: (1)iOS 最新App提交上架流程及部分问题的解决方案2016.12.21,感谢原博主!!! ( ...

  2. 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 th ...

  3. Last login: Wed Aug 24 17:23:14 2016 from wr702n.mshome.net

    今天,为了测试 RHEL 7(使用systemctl) 下双网卡绑定相关问题,在 Oracle VirtualBox 最小安装了centos 7. 半天使用下来使用 ssh 连接,突然看到了一行: L ...

  4. Python获取[2016年统计用区划代码和城乡划分代码(截止2016年07月31日)]

    #!usr/bin/env python #-*- coding:utf-8 -*- import requests import re import time ##系统初始化 urlHeader=& ...

  5. 如何修改windows server 2016系统用户的密码

    558idc.com运维教程之如何修改windows server 2016管理员帐号的密码 自由互联原创视频教程,建议在 1920*1080 分辨率下全屏观看. 您也可以下载本视频 Windows ...

  6. 24点游戏 计算机编程,关于24点游戏的编程思路与基本算法

    24点游戏的算法,其中最主要的思想就是穷举法.所谓穷举法就是列出4个数字加减乘除的各种可能性,包括括号的算法.我们可以将表达式分成以下几种:首先我们将4个数设为a,b,c,d,,其中算术符号有+,-, ...

  7. lol1月24服务器维护,LOL测试服1月24日:蔚技能全面调整 刀妹再次削弱

    原标题:LOL测试服1月24日:蔚技能全面调整 刀妹再次削弱 英雄联盟测试服今日进行了一部分小型改动. 英雄改动 青钢影 卡蜜尔 E-钩索 现在不再眩晕小兵. 刀锋舞者 艾瑞莉娅 基础属性 成长生命值 ...

  8. 分布式技术一周技术动态 2016.02.21

    分布式系统实践 1. 远程接口设计经验分享 http://mp.weixin.qq.com/s?__biz=MzAwNjQwNzU2NQ%3D%3D&idx=2&mid=4020649 ...

  9. App Store审核条款(2016.06.21更新)

    Before 一安全 1 不当内容 2 用户生成的内容 3 儿童分类 4 人身伤害 5 开发者信息 二性能 1 应用程序的完整性 2 Beta版测试 3 应用内容的准确性 4 硬件兼容性 5 软件要求 ...

最新文章

  1. 光棍节程序员闯关秀(总共10关)
  2. spring14:注解@Autowired,实现引用类型的赋值
  3. 干了10年软件工程师,我学到10个教训
  4. 进制转换,字符串,字节串之间转换
  5. iOS 在tableview的侧滑事件里执行tableView.selectRow无效的解决办法
  6. Linux学习之云服务器搭建嵌入式Linux开发环境
  7. error C2143: syntax error : missing ';' before '}'
  8. 2022中国供应链物流创新科技报告
  9. 禁止存放到内存_暴雨 ! 神木能源局:关于煤炭运输及存放的通告
  10. java 解决死锁_如何解决java中的死锁问题
  11. charles抓包工具_HTTP协议抓包工具:Charles for Mac
  12. wikioi 1430 素数判定
  13. 如何编译并使用x264库
  14. 《三国空城计》何为真知己真智慧
  15. Android HAL层
  16. 【程序员必读】经验:编程的智慧
  17. 一点资讯app signature
  18. mysql源码分析——InnoDB的内存应用整体架构源码
  19. 代码是如何编译成程序的?
  20. android固定位置拍照,Android调用系统相机拍照并保存到指定位置

热门文章

  1. linux 安装redis4.0.6,Redis(4.0.6)在Linux(CentOS7)下的安装
  2. java 模拟get登录_java 模拟get请求
  3. java运行时_java编译时与运行时概念与实例详解
  4. java perl_在Java中调用Perl脚本
  5. c语言n1=(n2=(n3=0)),计算机二级C语言考试选择题(带答案)
  6. 功能测试常用6种方法_建筑管道常用的8种连接方法
  7. java 类的存储结构设计_Doris存储层设计介绍1——存储结构设计解析
  8. 利用c语言检测气体浓度,一氧化碳气体检测仪的算法设计
  9. C++:vector中使用.clear()函数
  10. 一次失败的Pytorch模型量化尝试