好玩的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