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-2 Block

    block块 系列文章: iOS Block浅浅析 - 简书 iOS Block实现原理 iOS Block __...

  • Block 原理浅析

    Block 浅析 一、Block内存 (堆、栈、全局) 知识点: 栈区(stack)— 由编译器自动分配释放 ...

  • Block浅析

    先看一道关于block的面试题: 解答:arc下打印的是block内存地址,mrc下会crash原因:block默...

  • Block浅析

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

  • Block浅析

    block是语言的的扩展功能,它是一种带有自动变量(局部变量)的匿名函数. /******************...

  • block浅析

    Block 的本质是可以截取自动变量的匿名函数。 一.block的三种定义方式 1.返回值类型(^block的名字...

  • block浅析

    对block的了解不是特别多,平常用代理用的比较多; Block写法:^(传入参数列){行为主体};Block实体...

  • Block 浅析

    1.Block 的定义 In programming languages, a closure is a func...

  • iOS block浅析

    iOS开发中经常会使用block结合gcd来完成多线程编程,block也属于对象,主要有三种类型:1、 _NSCo...

  • block使用浅析

    实现目标,给键盘添加一个工具条 LZKeyboardTool.xib图: 效果图片: 笔者主要是想通过该示例程序来...

网友评论

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

本文标题:Block浅析

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