美文网首页
iOS block介绍

iOS block介绍

作者: _桃夭大人_ | 来源:发表于2019-01-29 16:52 被阅读5次

    1. 简介

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

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


    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的类型

    block分类

    6. block的循环引用问题

    (1)__block

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

    (2)__weak

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

    (1)__strong

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

    相关文章

      网友评论

          本文标题:iOS block介绍

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