借用iOS runloop若干问的开场白,鉴于才疏学浅,请各位牛人不吝指教。
1.GCD和Operation Queue的区别和联系?
GCD和Operation Queue都会负责创建线程,调度任务。GCD会把任务添加到dispatch queue,operation queue会把任务添加到operation queue,而且提交到operation queue的是NSOperation对象。
2.dispatch queue是什么?有哪些类型?有什么区别
dispatch queue是基于C的执行自定义任务机制,按照先进先出的顺序,串行或并发执行任务。
有两种dispatch queue,串行dispatch queue,并行dispatch queue。串行一次只能执行一个任务,直到当前任务完成才开始启动下一个任务,而并行dispatch queue则尽可能多地并发执行。
3.dispatch sources用来干什么?
用来监控系统事件,是一个基于C的系统事件异步处理机制。
4.operation objects中监控任务的进程有什么办法?
KVO
5.NSOperation有哪几种子类,有何区别联系?
有NSInvocationOperation和NSBlockOperation。前者基于一个对象和selector来创建operation object,后者执行多个block对象。
6.operation并发和非并发是怎样实现的?
把operation添加到queue中,
7.operation开始执行后,如何取消?
iscancelled
8.如果operation之间有依赖,怎样解决?
通过监测operation的isFinished
9.线程会产生大量临时的资源,怎样及时释放?
线程中采用autoreleasepool
10.怎样执行operation?
添加一个或一组operation到operation queue,也可以添加block对象。
手动执行operation,要求isReady返回YES,才能调用start方法。
11.系统给应用提供的哪几种并发dispatch queue?怎样获得这些queue?
三种dispatch queue,DISPATCH_QUEUE_PRIORITY_DEFAULT, DISPATCH_QUEUE_PRIORITY_HIGH, DISPATCH_QUEUE_PRIORITY_LOW,可以使用dispatch_get_global_queue得到。
12.怎样创建串行dispatch queue?
用dispatch_queue_create创建
13.怎样获得公共queue?
dispatch_get_main_queue,获得主线程关联的串行dispatch queue。
dispatch_get_global_queue,获得并发的queue
14.当创建一个dispatch queue后,怎样释放?
15.怎样异步添加任务到queue?同步呢?
dispatch_async
16。如果dispatch Queue中的任务需要独占访问资源,如何解决?
dispatch semaphore
17。如何使用dispatch source?
首先用dispatch_source_create创建dispatch source,再次为source设置一个事件处理器,例如使用dispatch_source_set_timer设置定时器信息。
18.dispatch source和提交到dispatch queue的一般任务有什么区别?
在执行时间上,当任务提交到dispatch queue后,一般会立即执行,而dispatch source可以把它看作是一个任务,只不过于一般任务的区别在于,dispatch source创建后,并不立即执行,而是当事件发生时,dispatch source会提交block或函数到dispatch queue去执行。
19dispatch source具体怎样实现?
首先,用接口dispatch_source_create创建一个事件源和dispatch source,然后设置事件处理器,例如dispatch_source_set_timer设置定时器,该函数参数分别是dispatch source,事件处理函数或是block,里面是作者自己的逻辑处理。
20.NSOperationQueue可以添加哪些内容?代码怎样实现?
可以添加NSOperation,一组Operations,block对象。
NSOperationQueue* aQueue = [[NSOperationQueue alloc] init];
[aQueue addOperation:anOp];
[aQueue addOperations:anArrayOfOps waitUntilFinished:NO];
[aQueue addOperationWithBlock:^{ /* Do something. */}];
21。isExecuting和isFinished怎样使用?
22。KVO在NSOperationQUeue中是怎样起作用的?
23。怎样可以实现顺序地执行operation对象?
把operation对象添加到串行operation queue中,用addDependency将两个operation对象之间建立依赖关系。
24。在NSOperation中怎样及时清理不再使用的临时对象?
在main方法中添加autorelease pool,也就是说只要是在多线程中,都要添加autorelease pool以便及时回收内存。
25。当operation对象执行完后,需要做什么工作?
执行完后,需要使用operation中的数据时,你要拥有operation对象的引用,否则operation在执行完后,被删除。
26。怎样使用operation的start方法?
27。当operation执行的工作量都很小,很琐碎时并且operation数量很多时,会出现什么问题? 怎样优化?
过多的调度operation,会浪费资源,降低系统性能。优化方法,尽量增加每个operation的工作量,减少operation的数量。
28。手动执行operation的过程是怎样的?
isready返回YES,调用start而不是main来执行operation
29。什么是单一线程?工作线程?线程池?工作原理各是什么?
单一线程就是创建一个线程执行单一任务,任务完成时释放线程。
工作线程,创建一个或多个线程执行任务,定期分配任务给每个线程。
线程池,创建一个通用的线程池,并为每个线程设置run loop,当要执行一个任务时,从池子中抓取一个线程,并分配任务给它,如果没有空闲线程,任务进入等待队列。
当任务要共享资源时,以上这些不适用。
30。怎样使用queue来取代有锁的thread?
如果任务必须按特定顺序执行,有两种方法,第一种,提交到串行dispatch queue,第二种,使用operation queue,将operation的关系设为dependency。
31。怎样使用dispatch queue实现生产者-消费者?
32。实现异步锁的传统方法怎样?用dispatch queue怎样实现?
传统方法,先得到锁,进行操作,释放锁。
33。dispatch queue什么时候用到同步提交?
当调用dispatch_async,当前线程会被阻塞,直到提交的block执行完毕后,才继续往下执行。
34。run loop一般用来处理异步事件,还有什么办法可以实现这种功能?
dispatch source
dispatch_async,addOperation
dispatch_sync,addDependency