学习IOS也有两三个月了,今天来总结下学习GCD的知识点,希望大家多多指教:
1.GCD简介以及block
GCD:Grand Central Dispatch或者GCD,是一套low level API,提供了一种新的方法来进行并发程序编写。从基本功能上讲,GCD有点像NSOperationQueue,他们都允许程序将任务切分为多个单一任务然后提交至工作队列来并发地或者串行地执行。GCD比之NSOpertionQueue更底层更高效,并且它不是Cocoa框架的一部分。使用GCD比使用NSOpertionQueue方便;
Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法。该方法在Mac OS X 10.6中首次推出,并随后被引入到了iOS4.0中。GCD是一个替代诸如NSThread, NSOperationQueue, NSInvocationOperation等技术的很高效和强大的技术,它看起来象就其它语言的闭包(Closure)一样,但苹果把它叫做blocks。
block:块是C语言的一种扩展。先给个典型的代码:
^(void){
NSLog(@"Program is funning\n");
};
由上例,典型的block指的是以插入“^”为开头为标识的代码块,^后面跟的(void)表示块所需要的参数列表;
当然,我们可以定义一个变量来表示这个block,就像是函数指针的感觉(有两种方法):
(1)方法1:如下例:
void (^printMessage) (void)=
^(void){
NSLog(@"Program is funning\n");
};
等号左边表示的是printMessage指向一个没有参数和返回值的块指针,第一个void是返回值(和C语言函数语法一致),第二个void指的是传入的参数(类比于函数的形参);
执行一个变量引用的块,与函数调用方法一致:
printMessage();
(2)方法2:如下例:(更加常用的方法)
dispatch_block_t block = ^{
//do something
};
调用方法一致:
block();
关于block变量:
(1)对于局部自动变量:在Block中只读。Block定义时copy变量的值,在Block中作为常量使用,所以即使变量的值在Block外改变,也不影响他在Block中的值。
int base = 100;
BlkSum sum = ^ long (int a, int b) {
// base++; 编译错误,只读
return base + a + b;
};
base = 0;
printf("%ld\n",sum(1,2)); // 这里输出是103,而不是3
注意:,可以从上面看到,这是block只会从定义该block之前取值,对于base=0这条语句是忽略的;
(2)static变量、全局变量。如果把上个例子的base改成全局的、或static。Block就可以对他进行读写了。因为全局变量或静态变量在内存中的地址是固定的,Block在读取该变量值的时候是直接从其所在内存读出,获取到的是最新值,而不是在定义时copy的常量。
static int base = 100;
BlkSum sum = ^ long (int a,