IOS RunLoop浅析 三

来源:互联网 发布:诺基亚6220c软件 编辑:程序博客网 时间:2024/05/16 19:47

IOS RunLoop浅析 三

经过两篇的介绍我想对RunLoop应该有了简单的了解,至少不至于一无所知。

在这篇我想对“CFRunLoopObserverRef”做一下简单的补充。

在补充之前先说一下。

在现在的开发中已经很少见到ARC了。

但是那是对与OC对象的。

CFRunLoopObserverRef属于CF (Core Foundation)

所以我们需要手动释放。

规则如下:

凡是带有creat copy retain 等成分的函数创建出来的对象都要要在最后进行释放,即Release。

复制代码
////  ViewController.m//  CX RunLoop浅析////  Created by ma c on 16/3/29.//  Copyright © 2016年 xubaoaichiyu. All rights reserved.//#import "ViewController.h"@interface ViewController ()@end@implementation ViewController- (void)viewDidLoad {    [super viewDidLoad];}-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{    //添加observe    /* 所监听的状态     kCFRunLoopEntry = (1UL << 0),     kCFRunLoopBeforeTimers = (1UL << 1),     kCFRunLoopBeforeSources = (1UL << 2),     kCFRunLoopBeforeWaiting = (1UL << 5),     kCFRunLoopAfterWaiting = (1UL << 6),     kCFRunLoopExit = (1UL << 7),     kCFRunLoopAllActivities = 0x0FFFFFFFU     */    CFRunLoopObserverRef observe = CFRunLoopObserverCreateWithHandler(CFAllocatorGetDefault(), kCFRunLoopAllActivities, YES, 0, ^(CFRunLoopObserverRef observer, CFRunLoopActivity activity) {                NSLog(@"监听到runloop-- %zd",activity);            });    //添加观察者    CFRunLoopAddObserver(CFRunLoopGetCurrent(), observe, kCFRunLoopDefaultMode);    //CF 内存管理 (Core Foundation)    /*     凡是带有creat copy retain 等成分的函数创建出来的对象都要要在最后进行释放,即Release。     */    CFRelease(observe);}@end
复制代码

上面是对CFRunLoopObserverRef的简单补充。

下面在这里简单介绍一下RunLoop的处理逻辑。

Runloop处理逻辑:

1,通知Observer,即将进入loop

2,通知Observer,将要处理timer

3,通知Observer,将要处理Source0

4,处理Source0

5,如果有Source1,跳到第9步

6,通知Obesrcer,线程即将休眠

7,休眠,等待唤醒

8,通知Observer,线程刚被唤醒

9,处理唤醒时收到的消息,之后跳回2

10,通知Oberver,即将退出Loop

0 0