美文网首页
oc 多线程

oc 多线程

作者: Bonew01 | 来源:发表于2022-07-19 16:44 被阅读0次

    25:多线程

    iOS多线程有哪些:

    1:pthread : 一套通用的多线程API

                适用于Unix\Linux\Windows等系统

                跨平台\可移植

                使用难度大

                语言:C语言.  线程生命周期:需要自己管理生命周期. 使用频率:几乎不使用.

    2:NSThread :使用更加面向对象

                简单易用,可直接操作线程对象

                语言:OC语言.  线程生命周期:需要自己管理生命周期. 使用频率:偶尔使用.

    3:GCD :  旨在替代NSThread等线程技术

            充分利用设备的多核

            语言:C语言.  线程生命周期:自动管理. 使用频率:经常使用.

    4:NSOperation : 基于GCD(底层是GCD)

                    比GCD多了一些更简单实用的功能

                    使用更加面向对象

                  语言:OC语言.  线程生命周期:自动管理. 使用频率:经常使用.

    25.1:atomic用于保证属性setter、getter的原子性操作,相当于在getter和setter内部加了线程同步的锁

    a: 可以参考源码objc4的objc-accessors.mm

    b: 它并不能保证使用属性的过程是线程安全的. 可以保证 set,get 方法是安全,但该属性使用过程不一定线程安全,例如: [p.data addObject:@"1"]; data属性用atomic 修饰,p.data 这个data的get方法是线程安全,但是 addObject: 不是线程安全

    25.2: 说一下 OperationQueue 和 GCD 的区别,以及各自的优势

    1. GCD 的核心是 C 语言写的系统服务,执行和操作简单高效,因此 NSOperation 底层也通过 GCD 实现,换个说法就是 NSOperation 是对 GCD 更高层次的抽象,这是他们之间最本质的区别。因此如果希望自定义任务,建议使用 NSOperation;

    2. 依赖关系,NSOperation 可以设置两个 NSOperation 之间的依赖,第二个任务依赖于第一个任务完成执行,GCD 无法设置依赖关系,不过可以通过dispatch_barrier_async来实现这种效果。NSOperation可以设置最大并发数,GCD没法直接设置最大并发数,可以通过信号量(dispatch_semaphore)来设置;

    3. KVO(键值对观察),NSOperation 和容易判断 Operation 当前的状态(是否执行,是否取消),对此 GCD 无法通过 KVO 进行判断;

    4. 优先级,NSOperation 可以设置自身的优先级,但是优先级高的不一定先执行,GCD 只能设置队列的优先级,无法在执行的 block 设置优先级;

    5. 继承,NSOperation 是一个抽象类,实际开发中常用的两个类是 NSInvocationOperation 和 NSBlockOperation ,同样我们可以自定义 NSOperation,GCD 执行任务可以自由组装,没有继承那么高的代码复用度;

    6. 效率,直接使用 GCD 效率确实会更高效,NSOperation 会多一点开销,但是通过 NSOperation 可以获得依赖,优先级,继承,键值对观察这些优势,相对于多的那么一点开销确实很划算,鱼和熊掌不可得兼,取舍在于开发者自己;

    7.NSOperationQueue⽀支持KVO,可以监测operation是否正在执⾏行行 (isExecuted)、 是否结束(isFinished),是否取消(isCanceld).GCD没法做到取消一个正在执行的线程。

    相关文章

      网友评论

          本文标题:oc 多线程

          本文链接:https://www.haomeiwen.com/subject/vmcsirtx.html