Block浅析

作者: soulDxl | 来源:发表于2016-11-22 14:25 被阅读43次

    参考了网上的一些Block的文档,加上自己对Block的使用、理解,对Block做一个简单的分析。

    Block是C语言的扩展,像其他语言的闭包一样。简单的可以这么说,Block是带有自动变量(局部变量)的匿名函数。

    Block的基本语法
      float (^sum)(float, float) = ^(float a, float b){
            
            return a + b;
        };
        
        sum(1,2);//求和
    
    Block的常见类型
    • _NSConcreteStackBlock(栈)
    • _NSConcreteGlobalBlock(全局)
    • _NSConcreteMallocBlock(堆)

    下面分别介绍这三种类型

    • NSStackBlock:位于堆内存,函数返回后Block将无效。对NSStackBlock进行copy操作会生成NSMallocBlock。对NSMallocBlock进行copy操作,会引起引用 计数加1。
    //MRC环境下...
     int x = 100;
        float (^sum) (int a, int b) = ^ float (int a, int b) {
            return x +a + b;
        };
        NSLog(@"%@",sum);
    

    打印结果:

    stack.png
    • NSMallocBlock:在Block内操作了外部变量。如果在作用域外部使用的话,ARC环境下,会自动进行copy,将生成的NSStackBlock变为NSMallocBlock。在MRC环境下,需要手动将其copy到堆上。
        int x = 10;
        float (^sumMalloc)(float, float) = ^(float a, float b){
            return a + b + x;
        };
        
        NSLog(@"Mallocblock is %@", sumMalloc); //block is <__NSGlobalBlock__: 0x47d0>
        NSLog(@"Mallocsum is %f", sumMalloc(1,2)); //block is <__13>
    

    打印结果:


    mallocBlock.png
    • NSGlobalBlock:在Block内没有引用外部变量或只用到全局变量、静态变量,对NSGlobalBlock的retain、copy、release操作都无效。
        float (^sum)(float, float) = ^(float a, float b){
            
            return a + b;
        };
        NSLog(@"block is %@", sum);
        NSLog(@"sum is %f", sum(1,2));
    

    打印结果:


    goobalBlock.png

    参考这里,理解有不足的地方望指出。

    相关文章

      网友评论

      • 王强iOS:大神,看了以后,理解更深了, 原本都不知道,block的具体分布。

      本文标题:Block浅析

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