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没法做到取消一个正在执行的线程。
网友评论