block

来源:互联网 发布:腾讯企业邮箱域名设置 编辑:程序博客网 时间:2024/05/18 03:53

block

  1. 什么是block
  2. block的简单应用
  3. block的适用范围
  4. block的注意事项

1.什么是blcok

block就是弥补了 指向函数的指针 不能够直接保存一个函数体(代码块)

2.blcok的简单应用

(1)无参数无返回值的block

    // 定义一个没有参数没有返回值的block    void (^block)(void) = ^{        NSLog(@"My name is block");    };    // block的调用    block();

(2)有参数无返回值的block

    // 定义一个有参数没有返回值的block    void (^block)(int) = ^(int num) {        NSLog(@"我今年%d岁了", num);    };    // block的括号中可以填入参数    block(20);

(3)无参数有返回值的block

    // 定义一个无参数有返回值的block    int (^block)() = ^{        return 10;    };    // 打印这个block的值    NSLog(@"%d", block());

(4)有参数有返回值的block

    // 定义一个有参数有返回值的block    int (^block)(int, int) = ^(int a, int b) {        return  a + b;    };    // 打印这个block的值    NSLog(@"%d", block(3, 4));

3.block的适用范围

1、block可以用于页面之间传值
2、block可以用于简化代码,增加代码的重用性

4.block的注意事项

1、在使用block作为属性时,要把其内存特性设为copy
2、在使用block修改block外部的局部变量时,要在该局部变量前加__block关键字(如下代码1)
3、在使用block中如果想调用self关键字时,要对该用一个__weak指针指向self,再在block中调用__weak指针,避免循环引用(如下代码2)

代码1

        // 如果想要改变,block代码块之外的变量值,就必须在变量前加入        // __block关键字        __block int x = 0;        int (^sumBlock)(int a, int b) = ^int (int a, int b) {            int result = (a * b);            x = result;            return result;        };        sumBlock(1, 2);        NSLog(@"%d", x);

代码2

    // __weak关键字修饰的指针指向self    __weak ViewController *view = self;    void (^block)() = ^{        // 在block中使用被__weak关键字修饰过的指针,可以避免循环引用        // 因为block会将其内部的对象变成强引用,会出现循环引用的状态        [view presentViewController:view1 animated:YES completion:^{        }];    };
1 0