美文网首页
Objective-C中的block

Objective-C中的block

作者: 小书同学 | 来源:发表于2019-12-24 11:26 被阅读0次

    在Objective-C的开发过程中,我们经常用到block,这里就简单总结一下block在Objective-C的几种使用方式。

    1、简单介绍一下block

    代码块Block是对C语言的扩展,用来实现匿名函数的特性,Block是一种特殊的数据类型,其可以正常定义变量、作为参数、作为返回值,特殊地,Block还可以保存一段代码,在需要的时候调用,目前Block已经广泛应用于iOS开发中,常用于GCD、动画、排序及各类回调。

        注: Block的声明与赋值只是保存了一段代码段,必须调用才能执行内部代码
    

    常见的是对block的声明。

    //typedef returnType (^TypeName)(parameterTypes);
    typedef void (^TeseDefVoidBlock)(NSString *);
    typedef NSString *(^TeseDefReturnBlock)(NSString *);
    

    如果想深入了解ios中的block,可以去看看这本书《Objective-C高级编程 iOS与OS X多线程和内存管理》,这里面有单独一章在深入讲解block。

    2、在函数(方法)中定义block

    block的格式

        block作为方法中的局部变量使用
        returnType (^blockName)(parameterTypes) = ^returnType(parameters) {...};
        returnType是返回值类型
        blockName是block名称
        parameterTypes是参数
    

    具体的例子:其中定义了一个News的类,可以忽略。

    /**
     在函数方法中局部变量block
     */
    - (void)testBlockInMethod{
    //    1、无返回值
        void (^voidBlock_1)(NSString *) = ^void(NSString *value) {
            NSLog(@"value:%@",value);
        };
    //    去掉后面的void
    //    void (^voidBlock_1)(NSString *) = ^(NSString *value) {
    //        NSLog(@"value:%@",value);
    //    };
        voidBlock_1(@"This is void block!");
    
    //    2、有返回值
        News *(^returnBlock_1)(NSString *, NSString *) = ^News *(NSString *title, NSString *content){
            News *news = [[News alloc]init];
            news.title = title;
            news.content = content;
            return news;
        };
    //    去掉后面的returnType
    //    News *(^returnBlock_1)(NSString *, NSString *) = ^(NSString *title, NSString *content){
    //        News *news = [[News alloc]init];
    //        news.title = title;
    //        news.content = content;
    //        return news;
    //    };
        News *news = returnBlock_1(@"测试标题",@"测试内容");
        NSLog(@"title:%@, content:%@",news.title,news.content);
    }
    

    3、block作为属性

    定义属性的block的格式

        block作为类属性
        @property (nonatomic, copy) returnType (^blockName)(parameterTypes);
        returnType是返回值类型
        blockName是block名称
        parameterTypes是参数
    

    具体例子如下:

    @property (nonatomic, copy) void (^voidBlock_2)(NSString *);
    @property (nonatomic, copy) News * (^returnBlock_2)(NSString *, NSString *);
    
    - (void)testBlockAsProperty{
        self.voidBlock_2 = ^void(NSString *value) {
            NSLog(@"voidBlock_2 : %@", value);
        };
        self.voidBlock_2(@"Test voidBlock_2!");
    
        self.returnBlock_2 = ^News *(NSString *title, NSString *content) {
            News *news = [[News alloc]init];
            news.title = title;
            news.content = content;
            return news;
        };
        News *news = self.returnBlock_2(@"测试标题",@"测试内容");
        NSLog(@"title:%@, content:%@",news.title,news.content);
    }
    

    4、block作为函数(方法)的传入参数

    block作为方法参数的方法格式

     Block作为方法参数
    - (void)someMethodThatTakesABlock:(returnType (^)(parameterTypes))blockName;
       returnType是返回值类型
       blockName是block名称
       parameterTypes是参数
    

    具体例子如下:

    - (void)testVoidBlock:(void (^)(NSString *blockParam))callBack{
     //    block作为方法参数(block 无返回值)
        callBack(@"在方法中 调用了voidBlock");
    }
    - (NSString *)testReturnBlock:(NSString * (^)(NSString *blockParam))callBack{
    //     block作为方法参数(block 有返回值)
        NSString *value = callBack(@"在方法中 调用了ReturnBlock");
        NSLog(@"value = %@",value);
        return value;
    }
    - (void)testRunBlockAsParams{
        [self testVoidBlock:^(NSString *blockParam) {
            NSLog(@"1、block回调 到这里了 -- %@",blockParam);
        }];
        NSString *returnValue = [self testReturnBlock:^NSString *(NSString *blockParam) {
            NSLog(@"2、block回调 到这里了 -- %@",blockParam);
            return [NSString stringWithFormat:@"param:%@",blockParam];
        }];
        NSLog(@"returnValue : %@",returnValue);
    }
    

    5、block作为函数(方法)的返回值

    block作为方法返回值的格式

     Block作为方法返回值
    -(returnType (^)(parameters))blockName;
     returnType是返回值类型
     blockName是block名称
     parameterTypes是参数
    

    具体例子如下:

    - (void(^)(NSString *blockParam))blockAsRetrunValue_1{
        void(^blockName)(NSString *) = ^(NSString *param) {
            NSLog(@"%@",param);
        };
        return blockName;
    }
    - (NSString *(^)(NSString *blockParam))blockAsRetrunValue_2{
        NSString *(^blockName)(NSString *) = ^NSString *(NSString *param) {
            return [NSString stringWithFormat:@"param : %@",param];
        };
        return blockName;
    }
    -(void)testRunBlockAsReturn{
        void (^voidBlock)(NSString *) = [self blockAsRetrunValue_1];
        voidBlock(@"test");
        NSString *(^returnBlock)(NSString *) = [self blockAsRetrunValue_2];
        NSString *value = returnBlock(@"test");
        NSLog(@"%@",value);
    }
    

    相关文章

      网友评论

          本文标题:Objective-C中的block

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