欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

IOS开发(101)之程序块block初窥

程序员文章站 2022-10-27 16:51:00
1 前言 以前也有介绍过gcd,但是感觉不够深入,今天我们来重新认识一下这个概念,gcd即grand central dispatch(中文直译宏伟的中心派遣o(╯□╰)o)。它...

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 结语
以上是所有内容,希望对大家有所帮助。