OC学习4——OC新特性之块(Block)

时间:2023-03-08 19:41:05
OC学习4——OC新特性之块(Block)

文章主要参考  关于OC中的block自己的一些理解(一)

对块的深入理解  浅析ios开发中Block块语法的妙用

1、关于block

block的作用:保存一段代码。

苹果官方推荐的一种语法,类似于C语言的函数,但是比函数更加灵活。

^是block语法的标识。

2、在Object-C中,块被当做一个对象来处理,这个对象可以:

有自己的局部变量

可以传入参数

有返回值

可以访问自己定义时的上下文变量

可以修改自己定义时特定的上下文变量

作为参数传递给其它函数

3、block的基本语法

OC学习4——OC新特性之块(Block)

4、block的使用

  1. 无返回值无参数
     - (void)myFirstBlock
    {
    //1.定义block
    void (^myblock)() = ^{ NSLog(@"无参数无返回值"); }; //2.调用block
    myblock();
    } //输出结果:2016-02-18 09:56:50.124 01-block[750:25107] 无参数无返回值
  2. 有参数没有返回值

     - (void)mySecondBlock
    {
    //1.定义block
    void (^mySecondBlock)(int,int) = ^ (int num1,int num2){
    NSLog(@"有参数无返回值:%d",num1 + num2);
    }; //2.调用block
    mySecondBlock(,);
    } //输出结果:2016-02-18 10:03:22.221 01-block[811:30160] 有参数无返回值:5
  3. 有参数有返回值
     - (void)myThirdBlock
    {
    //1.定义block
    double (^myThirdBlock)(double,double) = ^ (double r1,double r2){
    return r1 + r2;
    }; //2.调用block
    double r3 = myThirdBlock(1.1,2.2);
    NSLog(@"有参数有返回值:%f",r3);
    } //输出结果:2016-02-18 10:06:42.615 01-block[861:32505] 有参数有返回值:3.300000

5、block的注意点

  1. Block内部可以访问外部变量
  2. 默认情况下,Block内部不能修改外部的局部变量
  3. 给局部变量加上 _block 关键字,则这个局部变量可以在block内部进行修改
     - (void)myFourBlock
    {
    //int num = 5;
    __block int num = ;
    void (^myFourBlock)() = ^{ num = ;
    NSLog(@"%d",num);
    };
    myFourBlock();
    }

    上述代码中如果num的定义才用第3行的方式,则在运行第六行时会报错:missing __block type specifier; ,才用第4行的定义则可以正确输出:2016-02-18 10:25:02.195 01-block[1016:45943] 6

6、整体应用代码

 #import <Foundation/Foundation.h>

 typedef int (^MyBlock)(int,int); // block类型

 int cc = ;
int main(int argc, const char * argv[]) { int a = ;
__block int b = ;
void (^voidBlock)() = ^{
NSLog(@"------------");
//在bloc体内不能修改非__block声明的局部变量,可以修改全局变量和用__block声明的局部变量
//a = 10;
b = ;
cc = ;
};
NSLog(@"%d %d %d",a,b,cc);
voidBlock();
NSLog(@"%d %d %d",a,b,cc); int (^sumBloc)(int , int);
sumBloc= ^(int a,int b){ return a+b;
};
int (^subBloc)(int,int) = ^(int a,int b){
return a - b ;
}; int sum = sumBloc(,);
int sub = subBloc(,); NSLog(@"sum = %d sub = %d",sum,sub); voidBlock(); //------ typedef block类型用法------------ MyBlock sum1 = ^(int a,int b){
return a + b ;
}; MyBlock sub1 ;
sub1 = ^(int a ,int b){
return a - b ;
}; NSLog(@"sum1 = %d sub1 = %d",sum1(,),sub1(,)); return ;
}