Block用法

作者: 陌巷先森 | 来源:发表于2019-02-28 10:14 被阅读19次

    概述

    block:苹果在iOS4开始引入的对C语言的扩展,用来实现匿名函数的特性。
    匿名函数:没有函数名的函数,一对{}包裹的内容是匿名函数的作用域。

    block语法

    • block变量声明: 返回值类型(^block变量名)(参数列表);
    //声明一个无返回值,有两个int类型参数的,叫做blk的block
    void(^blk)(int a, int b);
    
    • block表达式语法:^返回值类型(参数列表){表达式};
    //无参数无返回值的block表达式
    ^void(void){
        NSLog(@"这是block块");
    };
    
    • block变量赋值: 返回值类型(^block变量名)(形参类型) =^(形参列表){表达式};
    //定义了一个返回值为int型,有两个int类型参数的,叫做add的block。表达式内将两个int参数相加,并将结果返回
    int(^add)(int,int) = ^(int a,int b) {
            int c = a+b;
            return c;
    };
    int result = add(5,4);
    NSLog(@"result----%d",result);
    

    使用typedef简写格式为:typedef 返回值类型(^block变量名)(形参列表)

    //用typedef定义一个block
    typedef int(^ADD)(int,int);
    // ADD就变为了一种Block类型,可以像声明变量一样来声明ADD
    ADD add_k = ^(int a,int b) {
        int c = a+b;
        return c;
    };
    int result_k = add_k(4,2);
    NSLog(@"result_k----%d",result_k);
    

    block与外界变量

    截获自动变量值

    对于 block 外的变量引用,block 默认是将其复制到其数据结构中来实现访问的。也就是说block的自动变量截获只针对block内部使用的自动变量, 不使用则不截获, 因为截获的自动变量会存储于block的结构体内部, 会导致block体积变大。特别要注意的是默认情况下block只能访问不能修改局部变量的值。

    int a = 10;
    void(^blk)(void) = ^(void) {
        NSLog(@"block内部a----%d",a);
    };
    a = 15;//Block外修改a,不影响block内的自动变量
    blk();//block内部a----10
    NSLog(@"a----%d", a);//a----15
    

    __block 修饰的外部变量

    对于用__block修饰的外部变量引用,block 是复制其引用地址来实现访问的。block可以修改__block修饰的外部变量的值。

    __block int a = 10;a为__block变量,可在block中重新赋值
    void(^blk)(void) = ^(void) {
        NSLog(@"block内部a----%d",a);
    };
    a = 15;
    blk();//block内部a----15
    NSLog(@"a----%d", a);//a----15
    

    防止block循环引用

    对block内要使用的对象A使用__weak进行修饰,block对对象A弱引用打破循环。

    __weak typeof(self) weakSelf = self;
    self.blk = ^{
        NSLog(@"In Block : %@",weakSelf);
    };
    

    参考:完整项目资料下载

    相关文章

      网友评论

        本文标题:Block用法

        本文链接:https://www.haomeiwen.com/subject/ihawdftx.html