iOS RunLoop

  • 每一个程序入口的mian函数就有一个RunLoop。

    UIApplicationMain函数内部启动的一个RunLoo,所以UIApplicationMain函数一直没有返回,这样就保持了程序的持续运行(这个RunLoop是相关联主线程的)

    代码:
    int main(int argc, char * argv[]) {
    @autoreleasepool {
    return UIApplicationMain(argc, argv,nil,NSStringFromClass([AppDelegate class]));
    }
    }

什么是RunLoop
  • 运行循环
  • 基本作用:
    1.保持程序的持续运行,如果没有RunLoop,程序执行完main函数就结束了。
    2.处理App中的各种事件(比如触摸事件、定时器事件、Selector事件)
    3.节省CPU资源,提高程序性能:该做事时做事,该休息时休息
RunLoop与线程间的关系

1.每一个RunLoop对象都有一个线程和它唯一对应。
2.主线程的RunLoop是自动创建的,子线程的RunLoop需要主动创建。
3.RunLoop是在第一次获取的时候创建,并在线程结束时自动销毁。

iOS中有2个API可以提供访问和使用RunLoop
  • Foundation : NSRunLoop
    [NSRunLoop currentRunLoop];// 获得当前线程的RunLoop对象
    [NSRunLoop mainRunLoop];// 获得主线程的RunLoop对象
  • CoreFoundation : CFRunLoopRef
    CFRunLoopGetCurrent();// 获得当前线程的RunLoop对象
    CFRunLoopGetMain();// 获得主线程的RunLoop对象
RunLoop相关类
  • CFRunLoopRef
  • CFRunLoopModeRef
  • CFRunLoopSourceRef
  • CFRunLoopTimerRef
  • CFRunLoopObserverRef

1.CFRunLoopModeRef

  • CFRunLoopModeRef代表RunLoop的运行模式
  • 一个 RunLoop包含若干个 Mode,每个Mode又包含若干个 Source/Timer/Observer
  • 每次RunLoop启动时,只能指定其中一个 Mode,这个Mode被称 作 CurrentMode
  • 如果需要切换Mode,只能退出Loop,再重新指定一个Mode进入,这样做主要是为了分隔开不同组的Source/Timer/Observer,让其互不影响

2.CFRunLoopTimerRef

  • CFRunLoopTimerRef是基于时间的触发器
  • CFRunLoopTimerRef基本上说的就是NSTimer,它受RunLoop的Mode影响

3.CFRunLoopSourceRef

  • CFRunLoopSourceRef是事件源(输入源)

4.CFRunLoopObserverRef

  • CFRunLoopObserverRef是观察者,能够监听RunLoop的状态改变
iOS RunLoop_第1张图片
png

添加观察者的代码:

//创建observer
  CFRunLoopObserverRefobserver =           CFRunLoopObserverCreateWithHandler(CFAllocatorGetDefault(),kCFRunLoopAllActivities,YES,0,^(CFRunLoopObserverRefobserver, CFRunLoopActivityactivity) {
NSLog(@"----监听到RunLoop状态发生改变---%zd",activity);
});

//添加观察者:监听RunLoop的状态
CFRunLoopAddObserver(CFRunLoopGetCurrent(),observer, kCFRunLoopDefaultMode);

//释放Observer
CFRelease(observer);

你可能感兴趣的:(iOS RunLoop)