RunLoop

一,什么是runloop?

  • 1、runloop从字面来说是指:运行循环。
  • 2、在代码实现上,runloop内部实质上是一个do-while循环。会不断的检测source、observer、timer等事件。
  • 3、runloop要保活,必须要在指定的mode里面添加事件源 (source,timer)
  • 4、在OC里,runloop的使用是懒加载,当第一次调用[NSRunLoop currentRunLoop]时,内部会自动创建一个runloop,并且在创建子线程的runloop时,首先就会检测主线程的runloop是否已存在,不存在也会创建,所以iOS里面主线程和主运行循环系统会自动帮我们创建好。

二、runloop与线程的关系?
一个线程对应一个runloop,在源码内部,线程作为key、runloop作为value.

三、runloop有哪些mode?区分这些mode的好处?
苹果公开的有:NSDefaultRunLoopMode (对应 kCFRunLoopDefaultMode) (主运行循环默认就在这个模式)NSRunLoopCommonModes(对应 kCFRunLoopCommonModes)这个并不是真正的模式,他是一组mode,打上common标记的mode有(NSDefaultRunLoopMode和UITrackingRunLoopMode)苹果没有公开的mode主要是UITrackingRunLoopMode
分开多个mode的好处是能够让runloop在同一时刻处理一种类型的事件(也就是方便分别事件等级)。比如用户处理拖拽事件的时候,runloop就专心处理TrackingMode。

四、runloop的实际使用场景有哪些?

  • 1、实现一个常驻子线程。像系统的主线程就是一个常驻线程。实现子线程常驻就需要在子线程创建一个runloop,并且要保活这个runloop.(也就是在这个runloop中添加事件,比如source、observer、timer)
  • 2、改变runloop的mode,比如定时器创建时,默认是在NSDefaultRunLoopMode下面,如果要能够在拖拽模式下也能执行,需要改变定时器的runmode。另外NSURLConnection默认也是放在默认模式下,在tableView滑动的时候,要想能够下载,也需要改变runmode。

参考地址:
http://blog.ibireme.com/2015/05/18/runloop/
http://www.jianshu.com/p/d260d18dd551
常驻子线程创建:http://www.jianshu.com/p/0b082ab5a494
比较容易理解且好的文章:http://www.cnblogs.com/zy1987/p/4582466.html

内链函数

一、作用:
解决函数调用效率的问题

  • 函数之间调用,是内存地址之间的调用,当函数调用完毕之后还会返回原来函数执行的地址。函数调用有时间开销,内联函数就是为了解决这一问题。
  • 不用inline修饰的函数, 汇编时会出现 call 指令.调用call指令就是就需要:
    (1)将下一条指令的所在地址入栈
    (2)并将子程序的起始地址送入PC(于是CPU的下一条指令就会转去执行子程序).

二、使用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 或者采用系统的宏 UIKIT_STATIC_INLINE
// UIKIT_STATIC_INLINECGFloat CGFloatFromPixel(CGFloat value) {
//    return value / YYScreenScale();
// }
static inline CGFloat CGFloatFromPixel(CGFloat value) {
    return value / YYScreenScale();
}
//YYScreenScale()方法说明:
CGFloat YYScreenScale() {
    static CGFloat scale;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        scale = [UIScreen mainScreen].scale;
    });
    return scale;
}

三、使用场景:
适合与小内存函数,频繁执行的函数。

四、参考地址:
http://www.cnblogs.com/sixindev/p/4469144.html
http://www.jianshu.com/p/d557b0831c6a
http://www.jianshu.com/p/a4b77a1157b1