IOS开发(101)之程序块block初窥
1 前言
以前也有介绍过gcd,但是感觉不够深入,今天我们来重新认识一下这个概念,gcd即grand central dispatch(中文直译宏伟的中心派遣o(╯□╰)o)。它的一个重要概念是队列。提供了许多预定义的队列,包括可以保证始终在主席那成上执行其工作的队列。
2 详述
gcd严格遵循fifo(先进先出)原则。添加到gcd队列的工作始终按照这个加入队列的顺序启动。尽管如此,他们不会总是按照相同的顺序完成,因为如果可能,gcd队列将自动在多个线程之间分配它的工作。
我们可以将将gcd理解为一个线程池。
跟gcd相关的是一种成为程序块的语言功能,这是向c语言本身添加的一些新语法。这对于充分的利用gcd非常重要。程序块背后的理念是像任何其他c语言类型一样的对待特定的代码块。程序块可以分配给一个变量,以参数的形式传递给函数或者方法。当然也可以执行。通过这种方式,程序块可用作objective-c中的委托模式或者c中的回调函数的代替路径。
程序块非常类似于方法或者函数,程序块可以接受一个或者多个参数并指定一个返回值。要声明程序块变量,可以使用“^”符号以及其他一些放在圆括号内的代码来声明参数和返回类型。要定义程序块本身,执行的操作大体相同,但在后面会添加定义程序块的实际代码,包含在花括号内。例子:
//声明一个没有参数和返回值的block变量 叫做loggerblock
void(^loggerblock)(void);
//实例化这个block
loggerblock = ^{nslog(@“i'm just glad they didn't call it a bug”);};
//执行这个block,就像调用函数一样
loggerblock();
如果想要block中能修改外部的变量,需要在声明变量之前添加存储修饰符__block,进行外部变量“读/写”。、注意block前面有两条下划线,而不是一条.
//定义一个可以改变的块变量
__block int a = 0;
//定义一个快修改a变量
void(^sillyblock)(void) = ^{a = 47;};
//在调用块之前检查a变量
nslog(@"a ==%d",a);//outputs "a==0"
//执行块
sillyblock();
//调用之后检查a的值
nslog(@"a==%d",a);//outputs “a==47”
3 结语
以上是所有内容,希望对大家有所帮助。
下一篇: PHP5中的时间相差8小时的解决办法