IOS Block-Block块的使用与理解

     在IOS中,block块是新添加的语法,其他程序语言中也被称为闭包。

     程序块的理念是像任何其他C语言类型一样对待特定的代码块。程序块可以分配给一个变量,以参数的形式传递给函数或方法,当然也可以执行(不同于其他大部分类型)。通过这种方式,程序块可替代Object-C中的委托模式或C中的回调函数。

     跟方法或函数很想,程序块可以接受一个或多个参数并指定一个返回值。要声明程序块变量,可以使用“^”符号以及其他一些放在圆括号内的代码来声明参数和返回类型。要定义程序块本身,执行的操作大体相同,但要在后面添加定义程序块的实际代码。

     例子(创建block、赋值block、调用block):(这里的block例子没有返回值)

//声明一个块变量myBlock,这个块参数没有返回值
void(^myBlock)(void);

//声明完之后,对myBlock赋值
myBlock = ^{NSLog(@"This is my block!")}

//声明完之后,我们执行这个块函数(就像调用函数一样调用)
myBlock();

    

     程序块可以访问在创建它的范围内所有可用的变量。在默认情况下,程序块通过这种方式获取了你要访问的变量,将值复制到一个新的同名变量中,保留原始变量不变。在block块中使用外部变量,如果外部变量是局部变量,要在这个变量声明前加__block。

     不同作用域变量对于block赋值不同。如果是局部变量A,在block内进行赋值,则可以赋值,外部赋值无效。例如:

//成员变量
int a
static int b;
 
{
    __block NSString d;

    void (^aBlock)(void) = ^(void) {
        a = 2;
        b = 3;
        d =  "d1"; //在block中设置d=d1
    };

    d= "d2";

//执行block,这里输出a=2, b=3, d='d1'   注意这里的d!=d2,是等于d1
    aBlock();
}

可以参照苹果官方文档对于block的介绍:

https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/Blocks/Articles/bxVariables.html

原文地址:https://www.cnblogs.com/alunchen/p/5341057.html