1. NSThread
1> 类方法 detachNewThreadSelector
直接启动线程,调用选择器方法
2> 成员方法 initWithTarget
需要使用start方法,才能启动实例化出来的线程
优点:简单
缺点:
* 控制线程的生命周期比较困难
* 控制并发线程数
* 存在死锁隐患
* 先后顺序困难
例如:下载图片(后台线程) -> 滤镜美化(后台线程) -> 更新UI(主线程)
2. NSOperation
1> NSInvocationOperation
2> NSBlockOperation
定义完Operation之后,将操作添加到NSOperationQueue即可启动线程,执行任务
使用:
1> setMaxConcurrentOperationCount 可以控制同时并发的线程数量
2> addDependency 可以指定线程之间的依赖关系,
从而达到控制线程执行顺序的目的,如先下载,再渲染图片
提示:
要更新UI,需要使用[NSOperationQueuemainQueue]addOperationWithBlock:
在主操作队列中更新界面
3. GCD
1) 全局global队列,如果是同步,则不开线程,在主队列中执行
方法:dispatch_get_global_queue(获取全局队列)
优先级:DISPATCH_QUEUE_PRIORITY_DEFAULT
所有任务是并发(异步)执行的
2) 串行队列 必须开一条新线程,全是顺序执行的
方法:dispatch_queue_create(创建串行队列,串行队列不能够获取)
提示:队列名称可以随意,不过不要使用@
3) 主队列
主线程队列
方法:dispatch_get_main_queue(获取主队列)
在gcd中,同步还是异步取决于任务执行所在的队列,更方法名没有关系
具体同步、异步与三个队列之间的关系,一定要反复测试,体会!
4.全局队列(可能会开启多条线程,如果是同步方法,则不开线程,只在主线程里)
dispatch_queue_t queue =dispatch_get_global_queue(
DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
串行队列(只可能会开启一条线程)
dispatch_queue_t queue =dispatch_queue_create("myQueue",
DISPATCH_QUEUE_SERIAL);
主队列
dispatch_get_main_queue();
异步操作
dispatch_async 异步方法无法确定任务的执行顺序
同步操作
dispatch_sync 同步方法会依次执行,能够决定任务的执行顺序
同步操作与队列无关,所有的队列的同步,都是顺序执行的
更新界面UI时,最好使用同步方法
GCD的优点:
充分利用多核
所有的多线程代码集中在一起,便于维护
GCD中无需使用@autoreleasepool
如果要顺序执行,可以使用dispatch_sync同步方法
dispatch_async无法确定任务的执行顺序
调用主线程队列任务更新UI时,最好使用同步方法
单例:
保证在内存中永远只有类的单个实例
建立方法:
1,声明一个静态成员变量,记录唯一实例
2,重写allocWithZone方法
allocWithZone方法是对象分配内存空间时,最终会调用的方法,
重写该方法,保证只会分配一个内存空间
3,建立sharedXXX类方法,便于其他类访问