首页 > 代码库 > 12-Objective-C特有语法:(高效率)block数据类型

12-Objective-C特有语法:(高效率)block数据类型

一、         基本简介

  • block用来保存一段代码 

    block的标志:^

  • block可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值。
  • 苹果官方建议尽量多用block。在多线程、异步任务、集合遍历、集合排序、动画转场用的很多
  • block跟函数很像: 1.可以保存代码 2.有返回值 3.有形参 4.调用方式一样 (和函数又有区别,函数是在编译之前就已经定义好了,是写死了的东西,而block在运行时可以凭空的产生一段运行代码)


二、        Block的特性

  • block特性

 1> 如何定义block变量

 int (^mySumBlock)(int, int);

 2> 如何利用block封装代码

 ^(int a, int b) {
    return a + b;
 };

 ^() {
    NSLog(@"----------");
 };

 ^ {
    NSLog(@"----------");
 };

 3> block访问外面变量

以代码示例为例:

void test3()
{
    int a = 10;
// 给局部变量加上__block关键字,这个局部变量就可以在block内部修改
    __block int b = 20;
    
    void (^block)();   
    
    block = ^{
        // block内部可以访问外面的变量
        NSLog(@"a = %d", a);
        
        // 默认情况下,block内部不能修改外面的局部变量
        // a = 20;
        
        // 给局部变量加上__block关键字,这个局部变量就可以在block内部修改
        b = 25;
    };        
    block();
}

 4> 利用typedef定义block类型

  可先用typedef先声明类型,再定义变量进行赋值

 typedef int (^MyBlock)(int, int);  // 以后就可以利用MyBlock这种类型来定义block变量

 MyBlock block;

 MyBlock b1, b2;

 b1 = ^(int a, int b) {
    return a - b;
 };

 MyBlock b2 = ^(int a, int b) {
    return a - b;
 };
  • 与函数对比:

  es: 定义了一个叫MySum的blocks对象,它带有两个int参数,返回int。等式右边就是blocks的具体实现

 

  在声明的同时定义变量,然后赋值
int (^MySumBlock)(int, int) = ^(int a, int b) {
  return a+b;
};

 //    ps:   如果block没有形参,可以省略后面的()

     pk(对比一下)指向函数的指针:

int sum(int a , int b)
{
     return a + b;    
}

int main()
{
      // 指针函数的指针
     int (*p)(int, int) = sum;
     int d = p(10, 12);
     NSLog(@"%d", d);
}