RunLoop

參考:http://www.cocoachina.com/ios/20150601/11970.html

Paste_Image.png

Paste_Image.png

1醋奠、Timer

- (void)timer2
{
    // 調(diào)用了scheduledTimer返回的定時器,已經(jīng)自動被添加到當前runLoop中绞幌,而且是NSDefaultRunLoopMode
    NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(run) userInfo:nil repeats:YES];
    
    // 修改模式
    [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
}

- (void)timer
{
    NSTimer *timer = [NSTimer timerWithTimeInterval:2.0 target:self selector:@selector(run) userInfo:nil repeats:YES];
    // 定時器只運行在NSDefaultRunLoopMode下屋谭,一旦RunLoop進入其他模式,這個定時器就不會工作
    //    [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
    
    // 定時器只運行在UITrackingRunLoopMode下徊都,一旦RunLoop進入其他模式,這個定時器就不會工作
    //    [[NSRunLoop currentRunLoop] addTimer:timer forMode:UITrackingRunLoopMode];
    
    // 定時器會跑在標記為common modes的模式下
    // 標記為common modes的模式:UITrackingRunLoopMode和NSDefaultRunLoopMode
    [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
}

- (void)run
{
    NSLog(@"----run");
}

2广辰、Observer

- (void)observer
{
    // 創(chuàng)建observer
    CFRunLoopObserverRef observer = CFRunLoopObserverCreateWithHandler(CFAllocatorGetDefault(), kCFRunLoopAllActivities, YES, 0, ^(CFRunLoopObserverRef observer, CFRunLoopActivity activity) {
        NSLog(@"----監(jiān)聽到RunLoop狀態(tài)發(fā)生改變---%zd", activity);
    });
//    /* Run Loop 狀態(tài)監(jiān)聽 */
//    typedef CF_OPTIONS(CFOptionFlags, CFRunLoopActivity) {
//        kCFRunLoopEntry = (1UL << 0),    //即將進入Loop
//        kCFRunLoopBeforeTimers = (1UL << 1),//即將處理Timer
//        kCFRunLoopBeforeSources = (1UL << 2),//即將處理Source
//        kCFRunLoopBeforeWaiting = (1UL << 5),//即將進入休眠
//        kCFRunLoopAfterWaiting = (1UL << 6),//剛從休眠中喚醒
//        kCFRunLoopExit = (1UL << 7),//即將退出Loop
//        kCFRunLoopAllActivities = 0x0FFFFFFFU
//    };
    // 添加觀察者:監(jiān)聽RunLoop的狀態(tài)
    CFRunLoopAddObserver(CFRunLoopGetCurrent(), observer, kCFRunLoopDefaultMode);
    
    // 釋放Observer
/*
    CF的內(nèi)存管理(Core Foundation)
    1.凡是帶有Create暇矫、Copy主之、Retain等字眼的函數(shù),創(chuàng)建出來的對象李根,都需要在最后做一次release
    * 比如CFRunLoopObserverCreate
    2.release函數(shù):CFRelease(對象);
 */
    CFRelease(observer);
}

3槽奕、應用場景:

  • 保住線程的生命(用屬性強引用的方式不好使)

#import "ViewController.h"
#import "XMGThread.h"

@interface ViewController ()

/** 線程對象 */
@property (nonatomic, strong) XMGThread *thread;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.thread = [[XMGThread alloc] initWithTarget:self selector:@selector(execute) object:nil];
    [self.thread start];
}

- (void)execute
{
    NSLog(@"----------execute----%@", [NSThread currentThread]);
    //在當前模式添加端口(因為如果當前模式?jīng)]有東西,RunLoop開啟會馬上退出)
    [[NSRunLoop currentRunLoop] addPort:[NSPort port] forMode:NSDefaultRunLoopMode];
    // 啟動(run執(zhí)行首先會判斷當前模式有沒有東西房轿,如果沒有就會退出)
    [[NSRunLoop currentRunLoop] run];
    //移除
//    - (void)removePort:(NSPort *)aPort forMode:(NSRunLoopMode)mode;
    
    NSLog(@"---------");
    
    // 類似于上面的[[NSRunLoop currentRunLoop] run]
    //    [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
    //    [[NSRunLoop currentRunLoop] runUntilDate:[NSDate distantFuture]];
}

- (void)test
{
    NSLog(@"----------test----%@", [NSThread currentThread]);
}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
//這句方法實質(zhì)是給self.thread這條線程中的RunLoop添加了Source(有source之后粤攒,RunLoop就不會退出了)
    [self performSelector:@selector(test) onThread:self.thread withObject:nil waitUntilDone:NO];
}
  • 在特定模式下執(zhí)行操作
- (void)useImageView
{
    // 只在NSDefaultRunLoopMode模式下顯示圖片
    [self.imageView performSelector:@selector(setImage:) withObject:[UIImage imageNamed:@"placeholder"] afterDelay:3.0 inModes:@[NSDefaultRunLoopMode]];
}
  • 子線程添加timer

需將timer手動添加到當前線程的RunLoop并開啟,不然不會執(zhí)行test方法囱持。主線程下默認做了這些操作夯接。


#import "ViewController.h"
#import "XMGThread.h"

@interface ViewController ()

/** 線程對象 */
@property (nonatomic, strong) XMGThread *thread;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.thread = [[XMGThread alloc] initWithTarget:self selector:@selector(execute) object:nil];
    [self.thread start];
}

//-(void)execute
//{
//   NSTimer *timer = [NSTimer timerWithTimeInterval:2.0 target:self selector:@selector(test) userInfo:nil repeats:YES];
//添加time到模式
//    [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
//    [[NSRunLoop currentRunLoop] run];
//}

- (void)execute
{
//scheduledTimerWithTimeInterval創(chuàng)建的time默認會添加到RunLoop默認模式
    [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(test) userInfo:nil repeats:YES];
    
    [[NSRunLoop currentRunLoop] run];
}

4、RunLoop自動釋放池什么時候釋放纷妆?

在RunLoop睡眠之前釋放(KCFRunLoopBeforeWaiting)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末盔几,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子凭需,更是在濱河造成了極大的恐慌问欠,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件粒蜈,死亡現(xiàn)場離奇詭異顺献,居然都是意外死亡,警方通過查閱死者的電腦和手機枯怖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門注整,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人度硝,你說我怎么就攤上這事肿轨。” “怎么了蕊程?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵椒袍,是天一觀的道長。 經(jīng)常有香客問我藻茂,道長驹暑,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任辨赐,我火速辦了婚禮优俘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘掀序。我一直安慰自己帆焕,他們只是感情好,可當我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布不恭。 她就那樣靜靜地躺著叶雹,像睡著了一般财饥。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上浑娜,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天佑力,我揣著相機與錄音,去河邊找鬼筋遭。 笑死,一個胖子當著我的面吹牛暴拄,可吹牛的內(nèi)容都是我干的漓滔。 我是一名探鬼主播,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼乖篷,長吁一口氣:“原來是場噩夢啊……” “哼响驴!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起撕蔼,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤豁鲤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后鲸沮,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體琳骡,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年讼溺,在試婚紗的時候發(fā)現(xiàn)自己被綠了楣号。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡怒坯,死狀恐怖炫狱,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情剔猿,我是刑警寧澤视译,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站归敬,受9級特大地震影響酷含,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜弄慰,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一第美、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧陆爽,春花似錦什往、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽躯舔。三九已至,卻和暖如春省古,著一層夾襖步出監(jiān)牢的瞬間粥庄,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工豺妓, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留惜互,地道東北人。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓琳拭,卻偏偏與公主長得像训堆,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子白嘁,可洞房花燭夜當晚...
    茶點故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)載:http://www.cocoachina.com/ios/20150601/11970.html RunL...
    Gatling閱讀 1,438評論 0 13
  • Run loop 剖析:Runloop 接收的輸入事件來自兩種不同的源:輸入源(intput source)和定時...
    Mitchell閱讀 12,432評論 17 111
  • 原文地址:http://blog.ibireme.com/2015/05/18/runloop/ RunLoop ...
    大餅炒雞蛋閱讀 1,158評論 0 6
  • http://www.cocoachina.com/ios/20150601/11970.html RunLoop...
    紫色冰雨閱讀 837評論 0 3
  • RunLoop 是 iOS 和 OS X 開發(fā)中非晨佑悖基礎的一個概念,這篇文章將從 CFRunLoop 的源碼入手絮缅,...
    iOS_Alex閱讀 905評論 0 10