iOS RunLoop,iosrunloop

來源:互聯網
上載者:User

iOS RunLoop,iosrunloop

  • 什麼是RunLoop
    • 運行迴圈
    • 一個線程對應一個RunLoop,主線程的RunLoop預設已經啟動,子線程的RunLoop得手動啟動(調用run方法)
    • RunLoop只能選擇一個Mode啟動,如果當前Mode中沒有任何Source(Sources0、Sources1)、Timer,那麼就直接退出RunLoop
  • RunLoop作用

    • 保持程式的持續運行
    • 處理App中的各種事件(比如觸摸事件、定時器事件、Selector事件)
    • 節省CPU資源,提高程式效能:該做事時做事,該休息時休息 ......
  • 類比RunLoop內部實現

    • 其實它內部就是do-while迴圈,在這個迴圈內部不斷地處理各種任務(比如Source、Timer、Observer)
    • void message(int num){    printf("執行第%i個任務", num);}int main(int argc, const char * argv[]) {    do {        printf("有事嗎? 沒事我睡了");        int number;        scanf("%i", &number);        message(number);    } while (1);    return 0;}

 

  • 獲得RunLoop對象

    • RunLoop對象
      • NSRunLoop
      • CFRunLoopRef
    • Foundation
      [NSRunLoop currentRunLoop]; // 獲得當前線程的RunLoop對象[NSRunLoop mainRunLoop]; // 獲得主線程的RunLoop對象
    • Core Foundation
      CFRunLoopGetCurrent(); // 獲得當前線程的RunLoop對象CFRunLoopGetMain(); // 獲得主線程的RunLoop對象
  • RunLoop結構

  • CFRunLoopRef對應RunLoop對象
    • CFRunLoopModeRef代表RunLoop的運行模式, 系統預設註冊了5個Mode
      • NSDefaultRunLoopMode:App的預設Mode,通常主線程是在這個Mode下運行
      • UITrackingRunLoopMode:介面跟蹤 Mode,用於 ScrollView 追蹤觸摸滑動,保證介面滑動時不受其他 Mode 影響
      • NSRunLoopCommonModes: 這是一個佔位用的Mode,不是一種真正的Mode
    • CFRunLoopTimerRef是基於時間的觸發器
      • CFRunLoopTimerRef基本上說的就是NSTimer,它受RunLoop的Mode影響
    • CFRunLoopSourceRef是事件來源(輸入源)
    • CFRunLoopObserverRef是觀察者,能夠監聽RunLoop的狀態改變
    • // 1.建立Observer    // 第一個參數:用於分配該observer對象的記憶體    // 第二個參數:用以設定該observer所要關注的的事件    // 第三個參數:用於標識該observer是在第一次進入run loop時執行, 還是每次進入run loop處理時均執行    // 第四個參數:用於設定該observer的優先順序    // 第五個參數: observer監聽到事件時的回調block    CFRunLoopObserverRef observer = CFRunLoopObserverCreateWithHandler(CFAllocatorGetDefault(), kCFRunLoopAllActivities, YES, 0, ^(CFRunLoopObserverRef observer, CFRunLoopActivity activity) {        switch(activity)        {            case kCFRunLoopEntry:                NSLog(@"即將進入loop");                break;            case kCFRunLoopBeforeTimers:                NSLog(@"即將處理timers");                break;            case kCFRunLoopBeforeSources:                NSLog(@"即將處理sources");                break;            case kCFRunLoopBeforeWaiting:                NSLog(@"即將進入休眠");                break;            case kCFRunLoopAfterWaiting:                NSLog(@"剛從休眠中喚醒");                break;            case kCFRunLoopExit:                NSLog(@"即將退出loop");                break;            default:                break;        }    });    // 2.添加監聽    /*     第一個參數: 給哪個RunLoop添加監聽     第二個參數: 需要添加的Observer對象     第三個參數: 在哪種模式下監聽     */    CFRunLoopAddObserver(CFRunLoopGetMain(), observer, kCFRunLoopDefaultMode);    // 3,釋放observer    CFRelease(observer);

       

  • RunLoopRunLoop處理邏輯
  • RunLoopRunLoop應用
    • NSTimer
      • 只能在指定的model下運行
      • NSTimer *timer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(test) userInfo:nil repeats:YES];[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
    • ImageView顯示
      • 只能在指定的model下設定圖片
    • PerformSelector
      • 只能在指定的model下調用
      • [self.imageView performSelectorOnMainThread:@selector(setImage:) withObject:[UIImage imageNamed:@"lnj"] waitUntilDone:YES modes:@[NSDefaultRunLoopMode]];

         

    • 常駐線程
      • 必須調用run才會執行死迴圈
      • NSRunLoop的model中必須有source/timer,死迴圈才不會退出
      • NSRunLoop *runloop = [NSRunLoop currentRunLoop];[runloop addPort:[NSMachPort port] forMode:NSDefaultRunLoopMode];[runloop run]

         

    • 自動釋放池
      • activities = 0x1 = 11: 即將進入RunLoop : 建立一個自動釋放池activities = 0xa0 = 160 = 128 + 3232:即將休眠 : 釋放上一次的自動釋放池, 建立一個新的自動釋放池128:即將退出RunLoop : 釋放自動釋放池

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.