iOS——block的基础使用

来源:互联网 发布:淘宝悠悠球哪个好 编辑:程序博客网 时间:2024/06/10 02:26
* block*  是块语法,实质上是匿名函数,是对C语言中函数的扩充* 可以用来保存一段代码,或者用来调用一段封装好的代码* 语法由于是由C语言实现的,所以执行效率特别高

数据类型

返回值类型 (^)(参数类型1 参数名2 ,参数类型2 参数名2 ··· ···);
注意:1. 如果要定义的block没有参数,括号也不能省略
2. 参数名可以省略,但是参数类型必须保留

// 定义block变量的格式 : 返回值类型 (^block变量名)(参数类型1,参数类型2··· ···)

  1. 无返无参的block
    void (^blockName)();

  2. 无返有参的block
    void (^blockName1)(参数类型1 int,参数类型2 int);

  3. 有返无参的block
    返回值类型int (^blockName2)();

  4. 有返有参的block
    返回值类型int (^blockName3)(参数类型1int,参数类型2int);

// 给block变量赋值 (block的实现)
格式: ^(参数类型1 参数名,参数类型2 参数名··· ···){

            执行代码;

}
注意:1.参数名不能省略
2. 如果有返回值需要用到return返回数据
3. 大括号后需要跟分号 ;

// block的调用

格式:block变量名(实参1,实参2 ··· ···);
block赋值的时候,block块中的代码不执行,只有当block调用的时候,block块中的代码才执行

  1. 实现无返有参的block
    blockName1 = ^(int a,int b){
    NSLog(@“%@“,a>b?a:b);
    };
    // 调用:
    blockName(10,20);

  2. 实现有返无参的block
    blockName2 = ^(){
    return需要返回的变量名;
    };
    int result = blockName2();
    NSLog(@“%@“,result);

  3. 实现有返有参的block
    blockName3 = ^(int a,int b){
    return a*b;
    };
    result1 = blockName3(10,4);
    NSLog(@“%d“,result1);

// 定义的同时为block进行变量赋值
void (^printBlock)() = ^(){
NSLog(@“…..”)
};
printBlock();
//————————————————————————————//
// 练习1:写一个有返回值的整型,参数为NSString类型,实现字符串数字转换为整型数据

int (^changeBlock)(NSString ) = (^NSString intString){
return [intString intValue];
};
int m = changeBlock(@“1111”);
NSLog(@“%d”,m);

//————————————————————————————//

给block起别名

typedef int (^FUN) (int, int);
其别名的格式: typedef 返回值类型(^新类型名)(参数类型列表)

typedef int (^block)(int,int);
block b = ^(int a,int b){
return a%b;
};

// 使用block时需要注意的问题 :
1. block块中可以直接访问局部变量,但是不能修改
int c = 15;
block b1 = ^(){
c++; // error!!
NSLog(@“%@“,c);
};
b1();
2. block 块中可以直接访问全局变量,也可以修改全局变量
3. 如果在块中非要修改局部变量,此时再定义局部变量的时候,在变量类型前面加上__block

__block int a = 3;
block b2 = ^(){
a++; // 此时是可以改变的
NSLog(@“%d”,a);
};
b2();

0 0