• Block的基本使用


    1.什么是Block

    • Block是iOS中一种比较特殊的数据类型

    • Block是苹果官方特别推荐使用的数据类型, 应用场景比较广泛

      • 动画
      • 多线程
      • 集合遍历
      • 网络请求回调
    • Block的作用

      • 用来保存某一段代码, 可以在恰当的时间再取出来调用
      • 功能类似于函数和方法

    2.block的格式

    • Block的定义格式
    返回值类型 (^block变量名)(形参列表) = ^(形参列表) {
    
    };
    
    • block最简单形式
    void (^block名)() = ^{代码块;}
    
    例如:
    void (^myBlock)() = ^{ NSLog(@"Test!"); };
    
    • block带有参数的block的定义和使用
    void (^block名称)(参数列表)
    = ^ (参数列表) { // 代码实现; }
    
    例如:
    void (^myBlock)(int) = ^(int num){ NSLog(@"num = %i", num); };
    
    • 带有参数和返回值的block
    返回类型 (^block名称)(参数列表)
    = ^ (参数列表) { // 代码实现; }
    
    例如:
    int (^myBlock)(int, int) = ^(int num1, int num2){ return num1 + num2; };
    
    • 调用Block保存的代码
    block变量名(实参);
    
    • block与typedef
    typedef int(^calculateBock)(int, int)
    int main(int argc, const char * argv[]) {
    //1.直接定义
      int (^sumBlock) (int, int) = ^(int value1, int value2){
          return value1 + value2;
      };
      int res = sumBlock(10 , 20);
      NSLog(@"res = %i", res);
    //使用typedef
      calculateBlock sumBlock = ^(int value1, int value2){
          return value1 + value2;
      };
      int res = sumBlock(10, 20);
      NSLog(@"res = %i", res);
      return 0;
      //如果是直接定义,则(^sumBlock)中的sumBlock就是函数名
      //如果是使用typedef定义,(^calculateBock)中的calculateBock是一种数据类型,需要使用它去创建一个这样的Block函数
      //calculateBlock sumBlock =...;则其中sumBlock就是函数名
    }
    

    3.Block注意事项

    • 在block内部可以访问block外部的变量
    int  a = 10;
    void (^myBlock)() = ^{
        NSLog(@"a = %i", a);
        }
    myBlock();
    输出结果: 10
    
    • block内部也可以定义和block外部的同名的变量(局部变量),此时局部变量会暂时屏蔽外部
    int  a = 10;
    void (^myBlock)() = ^{
        int a = 50;
        NSLog(@"a = %i", a);
        }
    myBlock();
    输出结果: 50
    
    • 默认情况下, Block内部不能修改外面的局部变量
    int b = 5;
    void (^myBlock)() = ^{
        b = 20; // 报错
        NSLog(@"b = %i", b);
        };
    myBlock();
    
    
    • Block内部可以修改使用__block修饰的局部变量
     __block int b = 5;
    void (^myBlock)() = ^{
        b = 20;
        NSLog(@"b = %i", b);
        };
    myBlock();
    输出结果: 20
    
  • 相关阅读:
    机器学习技法2-Dual Support Vector Machine
    机器学习技法1-Linear Support Vector Machine
    Section 2.2
    Section 2.1 专题乱乱的
    Section 1.5 也许这才是暴力搜索
    usaco生成器
    Section 1.4 搜索
    Section 1.3
    Section 1.2.5 Dual Palindromes 水
    Section 1.2.4 Palindromic Squares 大水
  • 原文地址:https://www.cnblogs.com/ShaRuru/p/5061971.html
Copyright © 2020-2023  润新知