美文网首页iOS
iOS中的Block

iOS中的Block

作者: MWY | 来源:发表于2015-07-27 20:33 被阅读225次

    Blocks是C语言的扩充功能:带有自动变量(局部变量)的匿名函数。通过Blocks,源代码中就能使用匿名函数,即不带名称的函数。在我们的工作中,命名占据了很大一部分,函数名,变量名,属性名,类名,框架名等都必须具备。能够编写不带名称的函数对程序员来说是具有相当吸引力的。
    C语言中的函数:
    返回值类型 函数名 (参数列表) 表达式

    Blocks:^ 返回值类型 (参数列表) 表达式

    1. 返回值类型 同OC/C语法中的返回值类型
    2. 参数列表 同C语法中的参数列表
    3. 表达式 同OC/C语法中允许使用的表达式
    ^int (int count) {return count++;}    
      
    ^NSString * (NSNumber *num) {
    return [NSString stringWithFormat:@%@",num"]; 
      
    

    Blocks的省略句式

    省略返回值

    ^ 返回值类型 (参数列表) 表达式

     ^(int count) {  return count++ }
     
     ^ (NSNumber *num) {
           return [NSString stringWithFormat:@"%@",num];
           }
    

    省略返回值类型时,如果表达式中有return语句就使用该返回值类型,如果表达式中没有return语句就使用void类型!

    
    ^(int count) {return count + 1;};   
    
    ^(NSNumber *num) {
          return [NSString stringWithFormat:@"%@",num];
          }
          
          
          
    ^(NSNumber *count) {
       NSLog(@"无返回值类型Block count = %@",count);   
       };  
       
    ^(void) {
        NSLog(@"无返回值类型也无参数Block");
        };  
    
    Block类型的变量

    在Block语法下, 可将 Block 语法赋值给声明为 Block 类型的变量中。 即源代码中一旦使用 Block 语法就相当于生成了可赋值给 Block 类型变量的 “值”。 Blocks 中由 Block语法生成的值也被称为 『Block』 。

    声明Block类型变量的示例如下:

    int (^counts) (int);是不是和C语言的函数指针非常相似,区别就是将*换成了^,int (* counts) (int);

    Block类型的变量和其他OC/C变量没有任何的区别

    • 自动变量
    • 函数参数
    • 静态变量
    • 静态全局变量
    • 全局变量
    int (^counts)(int) = ^(int count) {return count + 1;};
    
    NSString *(^str) (NSNumber *num) = ^NSString *(NSNumber *num) {
         return [NSString stringWithFormat:@"%@",num];    
      
    void (^blank) (NSNumber *count) = ^(NSNumber *count) {
        NSLog(@"无返回类型Blok count = %@",count);    
        };
        
    void (^blank)(void) = ^(void) {
       
       NSLog(@"无返回值类型也无参数block");
       };    
         
    

    在函数参数中使用Block类型变量向函数传递Block,即将Block变量作为函数的形参:void func (int (^counts)(int)) { }

    也可以使用typedef来简化记述方式

    typedef int (^count)(int);

    void func(count num) { }

    - (void)funcWithcount:(int (^)(int)) count { }

    - (void)funcWithcount:(count) count { }

    Block可以截获在它之前声明的变量,但也有特殊的地方,就是以const拷贝的方式访问非局部变量

    int main(int argc,const char *argv[]) {
       
       int val = 1;
       void (^blk) = ^{pintf("val = %d\n",val);   
       
       val = 2;
       blk();  
       return 0;
       } 
        
    

    此时输出的val是1;

    如果要修改来自自动变量的值:__block:

     int main(int argc,const char *argv[]) {
    
     __block int val = 1;
     void (^blk) = ^{pintf("val = %d\n",val);   
    
     val = 2;
    blk();  
    return 0;
    }  
    

    此时输出的val是2

    相关文章

      网友评论

        本文标题:iOS中的Block

        本文链接:https://www.haomeiwen.com/subject/tuumqttx.html