美文网首页
Block语法

Block语法

作者: OneCoinMan | 来源:发表于2016-10-18 19:40 被阅读0次

block定义

block类似于c语言中的函数指针,其定义方式为:
返回值类型 (blockName)(参数列表)=(参数){... ...};
如:

    NSString *rank = @"111";
    NSString *name = @"aaa";
    NSString * (^blockAppendingString)(NSString *str1, NSString *str2) = ^(NSString *str1, NSString *str2){
        str1 = [str1 stringByAppendingString:str2];
        return str1;
    };
    NSString * result = blockAppendingString(rank, name);
    NSLog(@"result is :%@",result);

使用

定义好的block可以想函数一样适用。但是更经常的是直接使用代码块如:

    NSArray *array = [NSArray arrayWithObjects:@"3", @"2", @"1", nil];
    NSArray *array2 = [array sortedArrayUsingComparator:^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2) {
        return [obj1 compare: obj2];
    }];
    NSLog(@"array2:%@", array2);

sortedArrayUsingComparator:方法中的block被当作参数传入方法中,并在需要的时候调用。

使用typedef

使用typedef可以定义一个代码块变量,当出现大量形式相同的代码块时,可以使用此方法:

    typedef NSString * (^str_block_type)(NSString  *str);
    str_block_type my_block = ^(void){
        return str;
    };
    str_block_type your_block =^(NSString *str){
        return @"your block type";
    };

其中str_block_type可以像int,NSString等字段一样使用,用来定义具有相同参数列表,和返回值的block。

block参数

block可以访问与其同级的变量,但是不能修改,如果要修改,需要将该变量定义为__block属性的变量:

    NSString *rank = @"111";
    NSString *name = @"aaa";
    __block NSString *result = @"22222";
    NSString * (^blockAppendingString)(NSString *str1, NSString *str2) = ^(NSString *str1, NSString *str2){
        result = [str1 stringByAppendingString:str2];

        return result;
    };

以上代码中,result被代码块使用时修改了其值,因此需要定义为__block属性,否则会报错。


错误.png

值得注意的是,代码块在被创建时,会捕捉此时的本地变量状态,在此之后更改变量,也不会改变block中该变量的值如:

NSString *test = @"before";
    NSString * (^blockAppendingString)(NSString *str1, NSString *str2) = ^(NSString *str1, NSString *str2){
        result = [str1 stringByAppendingString:str2];
        NSLog(@"test:%@",test);
        return result;
    };
    test = @"after";
    blockAppendingString(rank, name);

输出结果为“before”,而不是“after”。

相关文章

  • OC-Block语法

    block 语法 block语法 -> 块语法标准C里面没有Block, C语言的后期扩展版本, 加入了匿名函数;...

  • 深入理解iOS之 Block

    一 Block基本语法 1.1 什么是block 带有自动变量(局部变量)的匿名函数; 1.2 Block语法 ...

  • Block 底层原理

    Block语法 Block可以认为是一个匿名函数。语法声明如下: return_type (^block_name...

  • Block开发基础知识

    一、block基本语法(这里是语法,语法,语法!!!) 1、Block被称为"带有自动变量值的匿名函数",Bloc...

  • Block深层剖析(一)

    "Block"这个词既指源代码中的block语法,也指由block语法所生成的“值”。 1.Block的本质 首先...

  • 第二章 2.2.1 Block语法

    带有自动变量值的匿名函数Block的语法,即Block表达式语法。 完整形式的Block语法与一般的C语言函数定义...

  • 初步多线程(GCD)_1

    1. 常用方法: (1)block定义: -- block语法 a) 声明: ...

  • 10 iOS底层原理 - Block基本用法

    在研究Block本质之前呢,先简单说下,block的语法。 一,Block语法 1. 标准声明与定义 可以拆开来...

  • Objective-C的Block实质与实现探究 part-7

    Block存储域 1、全局块出现的2种场景 (1) 记述全局变量的地方有Block语法时 (2)Block语法的表...

  • iOS链式函数式响应式编程

    iOS链式,函数式,响应式编程 block表达式语法: 作为函数参数的语法 定义block简写 作为返回值的语法 ...

网友评论

      本文标题:Block语法

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