runloop详解

2017-12-08  本文已影响6人  繁华落尽2018
  1. ios main函数:UIApplicationMain(argc,argv,nil,NSStringFromClass([AppDelegate class]))传递nil相当于传递@“UIApplication”
    死循环--Runloop 循环

  2. runloop:
    不是苹果所特有的,ios,macos都有
    目的:
    保证当前线程不退出。
    负责监听事件,ios中网络事件,触摸事件,时钟
    runloop模式:
    默认模式-NSDefaultRunLoopMode、UI模式-UITrackingRunLoopModel、占位模式(默认&&UI模式)NSRunLoopCommonModes
    ui模式的特点:RunLoop会优先处理UI模式下的事件,UI模式只能够被UI事件所唤醒!!
    runloop优先处理UI事件
    默认模式:source、observer、timer
    UI模式:source、observer、timer(拖拽UI影响主线的runloop),拖拽屏幕UI模式被唤醒,ui模式处理事件
    如果timer事件添加在默认模式,在有UI操作时,timer事件会被挂起,如果添加在UI模式,只有在ui操作的时候timer事件才会执行,如果想在UI操作和不操作情况下都处理Timer事件,可以在默认模式和UI模式都添加timer事件,为了代码简介,苹果提供了占位模式。

  3. 在NSTimer中执行耗时错做
    [NSThreadsleepTimeInterval:1.0]
    耗时操作放子线程
    // 开一个子线程
    NSThread* thread = [NSTread allocl] initWithBlock:^{
    // block里面放耗时操作
    }

4.作为属性,强引用,会保住NSThread OC对象的命
线程走没有走和NSThtead对象没有关系,线程由cpu调度,一个强引用的对象没有办法保住线程的名。NSThread OC对象不是线程,NSThread对象用来控制线程。NSthread对象不是线程。
cpu执行完线程上的任务会把线程丢到线程池,线程就释放了;
线程对象不退出NSthread对象就不会释放,让线程由执行不完的任务就行了。
runloop可以从事件队列中取事件执行,每条线程上都有一个runloop,在第一次获取runloop的时候创建,懒加载的;
runloop被创建出来后,并不糊运行,需要手动的Run //开启run意味着开启循环,死循环;通过run用oc的方法就不能停止了。
runloop启动还有一个方法可以指定启动的时间[[NSRunLoop currentRunLoop] runUntilDate:]
[NSTread exit] 退出主线程后,子线程还在执行任务,界面卡住了。

上一篇 下一篇

猜你喜欢

热点阅读