美文网首页
Objective C 中 Block 的定义

Objective C 中 Block 的定义

作者: 舌尖上的大胖 | 来源:发表于2017-08-17 03:07 被阅读0次

    Objective C 中 Block 的各种声明和定义形式,看过八百遍了,总是忘记怎么写。现在写一遍记下来备查。

    本文以如下形式 block 举例:

    • 入参为两个 NSString * 类型参数
    • 返回值为 NSString * 类型

    实现两个字符串拼接

    用于说明 block 的如下写法:

    • 声明
    • 定义
    • 使用

    一、不使用 typedef

    1、普通形式声明、定义、使用 Block 方式

    // 声明
    NSString *(^myBlock)(NSString *, NSString *);
    
    // 定义
    myBlock = ^NSString *(NSString *str1, NSString *str2) {
        return [str1 stringByAppendingString:str2];
    };
    
    // 使用
    NSString *s = myBlock(@"abc", @"123");
    NSLog(@"s = %@", s);
    

    2、Block 作为函数参数

    // 声明
    - (void)callBlock:(NSString *(^)(NSString *, NSString *))myBlock;
    
    // 使用方法
    [obj callBlock:^NSString *(NSString *str1, NSString *str2) {
        return [str1 stringByAppendingString:str2];
    }];
    

    二、使用 typedef

    1、声明、定义、使用 Block 方式

    // typedef
    typedef NSString *(^MyBlockDef)(NSString *, NSString *);
    
    // 声明
    MyBlockDef myBlock;
    
    // 定义
    myBlock = ^NSString *(NSString *str1, NSString *str2) {
        return [str1 stringByAppendingString:str2];
    };
    
    // 使用
    NSString *s = myBlock(@"abc", @"123");
    NSLog(@"s = %@", s);
    

    2、Block 作为函数参数

    // typedef
    typedef NSString *(^MyBlockDef)(NSString *, NSString *);
    
    // 声明
    - (void)callBlockWithTypeDef:(MyBlockDef)myBlock;
    
    // 使用方法
    [obj callBlockWithTypeDef:^NSString *(NSString *str1, NSString *str2) {
        return [str1 stringByAppendingString:str2];
    }];
    

    三、总结

    1、所有区别都体现在 Block 的不同声明形式,具体定义形式都一致
    2、Block 的声明中,形参可以只指定类型,不指定参数名;定义中必须都完整指定;
    3、typedef声明块类型变量写法一致,但区别于对象方法中参数的声明。

    四、相关资料

    How Do I Declare A Block in Objective-C?

    (完)

    相关文章

      网友评论

          本文标题:Objective C 中 Block 的定义

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