1. 程式人生 > >IOS RunLoop淺析 三

IOS RunLoop淺析 三

control release ios 釋放 線程 pen right 代碼 imp

經過兩篇的介紹我想對RunLoop應該有了簡單的了解,至少不至於一無所知。

在這篇我想對“CFRunLoopObserverRef”做一下簡單的補充。

在補充之前先說一下。

在現在的開發中已經很少見到MRC了。

但是那是對與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

IOS RunLoop淺析 三