七、GCD中有2个用来执行任务的函数
1.用同步的方式执行任务
dispatch_sync(dispatch_queue_t queue, dispatch_block_t block);
其中queue是队列,block是任务。
2.用异步的方式执行任务
dispatch_async(dispatch_queue_t queue, dispatch_block_t block);
八、全局的并发队列
GCD默认已经提供了全局的并发队列,供整个应用使用,不需要手动创建。
使用dispatch_get_global_queue函数获得全局的并发队列
dispatch_queue_t dispatch_get_global_queue(
dispatch_queue_priority_t priority, // 队列的优先级
unsigned long flags); // 此参数暂时无用,用0即可
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); // 获得全局并发队列
九、全局并发队列的优先级
#define DISPATCH_QUEUE_PRIORITY_HIGH 2 // 高
#define DISPATCH_QUEUE_PRIORITY_DEFAULT 0 // 默认(中)
#define DISPATCH_QUEUE_PRIORITY_LOW (-2) // 低
#define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN // 后台
十、GCD中获得串行有2种途径
1.使用dispatch_queue_create函数创建串行队列
dispatch_queue_t
dispatch_queue_create(const char *label, // 队列名称
dispatch_queue_attr_t attr); // 队列属性,一般用NULL即可
dispatch_queue_t queue = dispatch_queue_create("cn.itcast.queue", NULL); // 创建
注意:
手动创建串行队列,非ARC需要释放手动创建的队列
dispatch_release(queue);
2.使用主队列(跟主线程相关联的队列)
主队列是GCD自带的一种特殊的串行队列
放在主队列中的任务,都会放到主线程中执行
使用dispatch_get_main_queue()获得主队列
dispatch_queue_t queue = dispatch_get_main_queue();
注意:使用sync函数往主队列中添加任务,会卡主当前的串行队列
十一、补充
凡是函数名种带有create\copy\new\retain等字眼, 都应该在不需要使用这个数据的时候进行release
GCD的数据类型在ARC环境下不需要再做release
CF(Core Foundation)的数据类型在ARC环境下还是需要再做release
注意:
NSString *str1 = @"NSString";
// Founation
CFStringRef str2 = (__bridge CFStringRef)(str1);//
Core Foundation
__bridge CFStringRef的意思是桥接,会自动将OC字符串转化成Core
Foundation字符串.
CFArrayRef array = CFArrayCreate(NULL, NULL, 10, NULL);
CFRelease(array);
Core Foundation中手动创建的数据类型,需要手动释放内存。其中CFRelease();会释放所有Core
Foundation框架手动创建类型的内存。