iOS block介绍

1. 简介

block是将函数及其上下文封装起来的对象。(引用别人的)

定义一个简单的block,在xcode中输入inlineBlock 就能看到xcode为我们准备好的代码块。


646335-a0db1717e9df4cec.png
block定义

2. block作为属性

定义了一个 名为blockName的成员属性

@property (nonatomic, copy) void(^blockName)(NSString *);

3. block作为方法参数

// 定义方法
- (void)testBlock:(void(^)(NSString * blockParam))callBack{
    callBack(@"在方法中 调用了block");
}
// 调用方法
 [self testBlock:^(NSString *blockParam) {
     NSLog(@"block回调 到这里了 -- %@",blockParam);
  }];

3. block作为方法返回值

- (void(^)(NSString * blockParam))blockAsRetrunValue{
    
    void(^blockName)(NSString*) = ^(NSString * param) {
        NSLog(@"%@",param);
    };
    return blockName;
}

4. block 捕获问题

  1. 对于 基本数据 类型 的 局部变量 截获 其值
  2. 对于对象类型 的 局部变量 连同其 所有权修饰符一起截获
  3. 局部静态变量指针形式 截获 ;
  4. 不截获全局变量和静态全局变量 直接访问;
    //  基本数据类型 截获其值
    int age = 10;
    void(^blockName)(void) = ^{
        NSLog(@"age == %d",age);
    };
    age = 20;
    blockName();
    // 打印结果:age == 10;
    //  局部静态变量 以指针形式截获
    static int age = 10;
    void(^blockName)(void) = ^{
        NSLog(@"age == %d",age);
    };
    age = 20;
    blockName();
    // 打印结果:age == 20;

5. block的类型

646335-006d85ff0fb1b619.png
block分类

6. block的循环引用问题

(1)__block

在ARC 和 MRC都可以使用,可以修饰对象,也可以修饰基本数据类型,可以在block中重新赋值。

(2)__weak

弱引用,只能在ARC下使用,只能修饰对象类型,在block中 只能使用不能修改。

(1)__strong

强引用,防止block中的对象 由于弱引用 被释放。

猜你喜欢

转载自blog.csdn.net/weixin_34112900/article/details/87101653
今日推荐