Block浅析

参考了网上的一些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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Block简介(copy一段) Block作为C语言的扩展,并不是高新技术,和其他语言的闭包或lambda表达式是...
    qui丶MyLove阅读 443评论 0 0
  • 先看一道关于block的面试题: 解答:arc下打印的是block内存地址,mrc下会crash原因:block默...
    打不死的小怪兽阅读 478评论 0 0
  • 前言 Blocks是C语言的扩充功能,而Apple 在OS X Snow Leopard 和 iOS 4中引入了这...
    小人不才阅读 3,791评论 0 23
  • Block基础和retain cycle(循环引用) blcok简介 Block 是c语言的扩展,并不是什么高新技...
    董军1990阅读 12,353评论 22 69
  • Block 的本质是可以截取自动变量的匿名函数。 一.block的三种定义方式 1.返回值类型(^block的名字...
    苹果上的小豌豆阅读 311评论 0 0