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 结语

以上是所有内容,希望对大家有所帮助。

原文地址:https://www.cnblogs.com/dyllove98/p/3125019.html