好玩的Block

作者: ChiCoChiCo | 来源:发表于2017-03-19 17:34 被阅读62次

    看下面的代码,可以运行吗,运行过后结果又是啥了。

    ^{
         NSLog(@"hello world");   
     }();
    

    O(∩_∩)O哈哈~,第一眼看着个我感觉不可以运行,可是当我Run了一下后,竟然神奇的输出了hello world,😝😝😝... 只因以前只注重实用的东西,没有认真的去看Block,只是想会用就可以了,想想就有点惭愧啊,遂决定痛改前非,做回我的程序员。

    网上有很多讲block的实质和应用了,我来点新鲜的,ChiCo眼中的Block。啦啦啦... 大师们看到了可以随便喷,哈哈! Block 是可以带参数和定义变量的() 调用可以带返回值的{}。下面是一组比较另类的block

    void exampleA() {
        
        //常用的用block变量名调用block
        char a = 'A';
        void (^block1)() =  ^{
            printf("%c",a);
        };
        block1();
        
        //不需要名字的另类直接调用
        ^{
            printf("%c",a);
        }();
        
        //带有参数的常规调用
        void (^block2)(int a,int b) = ^(int a, int b){
            NSLog(@"a + b = %d",a+b);
        };
        block2(2,3);
    
        //带有参数的另类直接调用
        ^(int a, int b){
            NSLog(@"a + b = %d",a+b);
        }(2,3);
        
        //带有返回值的常规调用
        int (^block3)(int a,int b) = ^(int a, int b){
            NSLog(@"a + b = %d",a+b);
            return  a + b;
        };
        int result1 = block3(4,5);
        NSLog(@"result1 %d",result1);
        
        //带参数和返回值的直接调用
        int result2 =  ^(int a, int b){
            NSLog(@"a + b = %d",a+b);
            return  a + b;
        }(6,7);
        NSLog(@"result2 %d",result2);
    }
    

    block 还可以放到数组里边,我滴个神啊

    void exampleB()
    {
        
        NSMutableArray *array = [NSMutableArray array];
        exampleB_addBlockToArray(array);
        
        //搞个block变量来调用
        void (^block)() = [array objectAtIndex:0];
        
        //返回结果直接转block,立马调用
        ((void (^)())[array objectAtIndex:0])();
        
        //括号包住类型就可以强转
        ((aBlock)[array objectAtIndex:0])();
        
        //隔一会在调用
        block();
    }
    
    void exampleB_addBlockToArray(NSMutableArray *array)
    {
        char b = 'B';
        [array addObject:^{
            printf("%c",b);
        }];
    }
    

    有意思吧,(≧▽≦)/啦啦啦, 下面简单的做点block使用注意笔记

    //1. typedef 一个block后可以很方便的使用block
    typedef void (^aBlock)();
    void exampleC()
    {
        exampleC_getBlock()();
    }
    
    aBlock exampleC_getBlock()
    {
        char c = 'C';
        return ^{
            printf("%c",c);
        };
    }
    

    2.在block中要修改局部变量,需要加上关键字__block

    void exampleD()
    {
        __block int a = 100;
        void (^block1)() = ^{
            NSLog(@"a= %d",a);
            a = 99;
            NSLog(@"a= %d",a);
        };
        block1();
        NSLog(@"a = %d",a);
        
        int (^block2)(int a1) =  ^(int a1){
            
            NSLog(@"a1 = %d",a1);
            a1 = 10;
            NSLog(@"a1 = %d",a1);
            return a1;
        };
        int result =  block2(3);
        NSLog(@"result = %d",result);
    }
    

    3.block的持有者如果要在block中使用持有者的东西,需要将持有者变成__weak 类型的,这样可以解决循环引用,不然block的持有者释放不了

    - (void)exampleE
    {
        self.name = @"李明";
        self.age = @"23";
        __weak typeof(self) weakSelf = self;
        self.block = ^{
            //价格strong 可以让self在block执行完之前一直保存
            __strong typeof(weakSelf) strongSelf = weakSelf;
            NSLog(@"name = %@",strongSelf.name);
            NSLog(@"age = %@",strongSelf.age);
        };
        
        self.block();    
    }
    

    好啦,我的block讲完了,如果您有更有意思的发现,欢迎告诉我。

    相关文章

      网友评论

        本文标题:好玩的Block

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