Object_C 回顾 0.1.2 block函数

OC中block的使用:

block:Block对象提供了创建特殊函数的方法,函数体可用C,Objective-C,C++等C类的语言做表达式. 在其他的语言环境中,block变量可能会被叫做"闭包(closure)", 而在这里,除非和标准C术语的一段(block)代码混淆的情况之外,一般称为"blocks"。(前面不拉不拉一大堆的意思是你不需要懂,你只要知道就行了,关于block的定义可以去看官方的API)。

为何要使用block

一个block就是一块匿名的代码块:

  • 和函数一样有含类型的参数列表
  • 有直接声明或可推断出的返回值
  • 可以获得当前词法范围的状态
  • 有能力修改当前词法范围的状态
  • 可以和当前词法范围的其他block共同修改状态
  • 可以持续共享和修改当前词法范围的状态,甚至在当前词法范围销毁之后

你可以copy一个block还可以将其传到别的线程以延后执行 (或本线程的执行循环里). 编译器和运行时会把block里用到的所有变量保存到该block的所有拷贝的生存期后。尽管blocks可以由纯C或C++写成,但block本身始终是一个Objective-C变量.

优点:

blocks基于两大理由,是传统回调函数的优秀替代品:

  1. 允许你把具体实现代码写在调用该方法的地方. Blocks也经常是framework的方法参数.    
  2. 可以访存局部变量. 不需要像以前的回调一样,把在操作后所有需要用到的数据封装成特定的数据结构, 你完全可以直接访问局部变量.
(使用block不需要你去声明定义后再使用,随时定义随时使用,可以嵌套,在函数中进行定义和引用,关于block,我也许会说一大堆来讲block的定义,说它的优点,工作原理如何...总之一句话就可以了,用block吧,用它方便快捷,这就足够了)


如何使用:

//重定义一下
typedef float (^BlockType) (float,float);

<span style="font-family:FangSong_GB2312;font-size:14px;">//block变量的定义 和 block 语法块的实现
        //在Block中 有一个"^" 起标识作用
        //block 语法块 其实就是一个匿名函数,他相比较其它函数 可以进行函数嵌套定义
       void(^sayHiBlock)() = ^  void ()
        {
            NSLog(@"认识我吗?");
        };//定义了一个数据类型 void(^)() ,变量名为 sayHiBlock ,初值为 ^void (){NSLog(@"认识我吗?");} 的一个block 变量
        
        //block的使用
        sayHiBlock();
        
        //求两个数之和 的block
        int (^sumValueBlock)(int,int) = ^ int (int a,int b){
        
            return a + b;
        };
        
        int max = sumValueBlock (5,6);
        
        NSLog(@"sum = %d",max);
        //求两个数只差
        int(^subBlock)(int, int) = ^ int (int a, int b)
        {
            return a - b;
        };
        NSLog(@"%d",subBlock(16,11));
        
        int (^exchengeBlock)(NSString *) = ^ int (NSString *a)
        {
        
            return [a intValue];
        };
        
        NSLog(@"%d",exchengeBlock(@"1232131"));
        
        //加
        BlockType sumBlock = ^float (float a,float b){
            return a + b;
        };
        NSLog(@"和 = %.2f",sumBlock(5,4));
        
        //减
        BlockType subBlock1 = ^float (float a, float b){
            return a - b;
        };
        NSLog(@"差 = %.2f",subBlock1(9,17));
        
        //乘
        BlockType mulBlock = ^float (float a, float b){
            return a * b;
        };
        NSLog(@"积 = %.2f",mulBlock(19,7));

        //除
        
        BlockType divBlock = ^float (float a, float b){
            return a / b;
        };
        NSLog(@"商 = %.2f",divBlock(9,7));</span>
<span style="font-family:FangSong_GB2312;font-size:14px;">//        //__block 告诉编译器 将所修饰的变量 在block 内部仍然识别为可以改变的量 弱引用
        __block int a = 10;
        
        int (^testBlock)() = ^int (){
            a = 15; //对于局部变量 在block 内部被识别为 不可改变的的量
            b ++; //对于全局变量 在block 内仍然识别为变量
            NSLog(@"a = %d",a);
            NSLog(@"b = %d",b);
            return a;
            
        };
        
        testBlock();</span>


Tips:

<span style="font-family:FangSong_GB2312;font-size:14px;"> //NSString
        NSString *str = @"糖";
        NSMutableString *muSet = [NSMutableString stringWithFormat:@"%@",str];
        
        NSArray *arr = @[@"1",@"2",@"3"];
        
        //等价于 [NSArray arrayWithObjects: @"1",@"2",@"3",nil];
        NSMutableArray *muArr = [NSMutableArray arrayWithArray:arr];
        
        [arr objectAtIndex:1];
        arr[1];
        
        
        //字典 NSDictionary
        NSDictionary *dic = @{@"name1": @"笑笑语法",@"name2":@"语法糖",@"name3":@"字面量"};
        NSLog(@"%@",dic);
        NSLog(@"%@",dic[@"name3"]); //等价于 [dic valueForKey:@"name3"];
        
        NSMutableDictionary *muDic = [NSMutableDictionary dictionaryWithDictionary:dic];
        
        //NSNumber
        NSNumber *num = @12;// [NSNumber numberWithInt:12];
</span>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章