block

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:^{

        }];
    };

你可能感兴趣的:(ios,循环引用,block)