看了一堂公开课,自己小结一下:

 Runloop:

  内部有三个东东:(Source, Timer, Observer)

  作用/本质:1.死循环 (为app 保活);  

        2.监听处理事件

Timer 理解:

#pragma runloop -- Timer 理解 ()
NSThread *theard = [[NSThread alloc] initWithBlock:^{
NSTimer *timer = [NSTimer timerWithTimeInterval:1.0 repeats:YES block:^(NSTimer * _Nonnull timer) {
NSLog(@"--timer-thread:%@",[NSThread currentThread]);
}];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
[[NSRunLoop currentRunLoop] run];//run这个子线程/添加死循环,保证这个子线程存活。
//线程声明周期:只和它的任务有关系,任务没了,线程就没了!!!
}];
//开启线程
[theard start];

source 理解:

#pragma runloop -- source 理解 (GCD 定时器)
dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, , , dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, ));
dispatch_source_set_timer(timer, DISPATCH_TIME_NOW, 1.0 * NSEC_PER_SEC, * NSEC_PER_SEC);
dispatch_source_set_event_handler(timer, ^{
NSLog(@"--GCD:%@",[NSThread currentThread]);
});
//全局化timer,不然执行一次后就被销毁了,
_timer = timer;
dispatch_resume(_timer);

observer 理解:

#pragma runloop -- observer 理解 (CoreFundation 监听runloop 事件)
//获取runloop
CFRunLoopRef runloop = CFRunLoopGetCurrent();
//创建观察者 (creat, new, copy 都会去堆中开辟内存空间!!)
CFRunLoopObserverRef observerRef = CFRunLoopObserverCreate(NULL, kCFRunLoopBeforeTimers, YES, runloop, &callback, NULL);
//添加观察者
CFRunLoopAddObserver(runloop, observerRef, kCFRunLoopDefaultMode);
//释放观察者 observerRef 结构体指针(不能使用free,free只会释放该指针指向的堆区A;所指向的堆区内部可能含有指针,指向其他的堆区域B,free造成B的无法释放,内存泄漏!!)
// free(observerRef);
CFRelease(observerRef);

其他知识点:

//    常用的一对方法:
// malloc(<#size_t __size#>) 向硬件要一定大小的内存空间,
// free(<#void *#>)  释放内存空间 //线程之间的通讯
// self performSelector:@selector(<#selector#>) onThread:<#(nonnull NSThread *)#> withObject:<#(nullable id)#> waitUntilDone:<#(BOOL)#>
//退出线程
//[NSThread exit];
// UIKit 是线程安全的吗? 不安全 为了避免多线程访问,资源抢夺,用主线程刷新UI,不用消耗内存进行加锁

如有理解偏差,请不惜指教!

Runloop理解的更多相关文章

  1. iOS Runloop理解

    一.RunLoop的定义 当有持续的异步任务需求时,我们会创建一个独立的生命周期可控的线程.RunLoop就是控制线程生命周期并接收事件进行处理的机制. RunLoop是iOS事件响应与任务处理最核心 ...

  2. iOS开发 - RunLoop理解

    RunLoop概念 运行循环,一个 run loop 就是一个事件处理的循环,用来不停的调度工作以及处理事件 作用 保持程序的持续运行 监听处理App中的各种事件(触摸事件,定时器事件,selecto ...

  3. iOS runLoop 理解

    目录 概述 run loop modes 一.概述 run loop叫事件处理循环,就是循环地接受各种各样的事件.run loop是oc用来管理线程里异步事件的工具.一个线程通过run loop可以监 ...

  4. iOS开发之再探多线程编程:Grand Central Dispatch详解

    Swift3.0相关代码已在github上更新.之前关于iOS开发多线程的内容发布过一篇博客,其中介绍了NSThread.操作队列以及GCD,介绍的不够深入.今天就以GCD为主题来全面的总结一下GCD ...

  5. NSRunLoop

    1.什么是RunLoop 运行循环 一个线程对应一个RunLoop,主线程的RunLoop默认已经启动,子线程的RunLoop得手动启动(调用run方法) RunLoop只能选择一个Mode启动,如果 ...

  6. NSRunLoop原理详解——不再有盲点

    编程最怕的就是有盲点,不确定,而runloop官网对其提及的又很少:那么看完这篇应该使你有底气很多~ RunLoop整体介绍 An event-processing loop, during whic ...

  7. 深入理解RunLoop

    网上看的一篇文章,写的真好,我得多看几次好好理解理解 膜拜大神,转载至此便于学习查看. 此处标明原文链接:http://blog.ibireme.com/2015/05/18/runloop/    ...

  8. Runloop之个人理解

    Runloop之个人理解更像是一种线程等待机制,传统线程的消息传入机制,线程收到什么样的消息,就执行什么样的动作,如果是信号量队列型的,其实就基本实现了线程在无消息时挂住休眠;而不是在每隔一段时间就要 ...

  9. RunLoop机制理解

    一.浅识RunLoop RunLoop在开发中我们一直在用,但是没有注意他.要想理解RunLoop,首先我们需要先了解一下程序运行机制. 程序运行机制:我们都知道OC是运行时语言,也就是说对象的类型是 ...

随机推荐

  1. 转帖 JS的基础语法2

    条件语句(if.switch). 循环语句(while.do…while. for … in).跳转语句(break,continue) 1.条件语句 Ø if语句 javascrip中的if语句 v ...

  2. linux运维配置讲解--sshd-config

    文件配置: 1, /etc/ssh/sshd_config ssh配置文件 2, /etc/shadow 密码文件 3, /etc/sudoers 授权用户管理文件 4, /etc/issue 系统信 ...

  3. 牛客网Java刷题知识点之UDP协议是否支持HTTP和HTTPS协议?为什么?TCP协议支持吗?

    不多说,直接上干货! 福利 => 每天都推送 欢迎大家,关注微信扫码并加入我的4个微信公众号:   大数据躺过的坑      Java从入门到架构师      人工智能躺过的坑          ...

  4. PLSQL Developer 客户端工具的安装

    安装之前先把客户端工具instantclient_12_1拷贝到一个没有中文和空格的目录中去, 比如我直接放到了D:\tools下面.注意这里需要的是32bit的. 下面开始安装PLSQL Devel ...

  5. BSON入门

    1.概念BSON(Binary Serialized Document Format)是一种类json的一种二进制形式的存储格式,简称Binary JSON,它和JSON一样,支持内嵌的文档对象和数组 ...

  6. 《X86汇编语言:从实模式到保护模式》读书笔记之引言

    有幸结识了<X86汇编语言:从实模式到保护模式>一书.我觉得这本书非常好,语言活泼,通俗易懂,源码丰富,受益匪浅.读罢一遍,意犹未尽.于是打算再读一遍,并把自己的读书所学总结成笔记,一来给 ...

  7. JS之this那些事

    一直以来,对this的讨论都是热门话题.有人说掌握了this就掌握了JavaScript的80%,说法有点夸张,但可见this的重要性.至今记录了很多关于this的零碎笔记,今天就来个小结. 本人看过 ...

  8. js.css嵌入dll

    处理请求,返回 public ActionResult Get() { //传递一个部分名称 var n = Request["n"]; n = n.Replace('/', '. ...

  9. java集合框架(二):HashTable

    HashTable作为集合框架中的一员,现在是很少使用了,一般都是在面试中会问到其与HashMap的区别.为了能在求职的时候用上场,我们有必要对其原理进行解读. HashTable的实现原理跟Hash ...

  10. oracle学习篇六:子查询

    -- 1.查询比7654工资要高的员工 select * from emp where sal>(select sal from emp where empno=7654); ---2.查询最低 ...