Block的内存结构

栏目: IOS · 发布时间: 7年前

内容简介:Block在iOS日常开发中极其常见,大家应该几乎都使用过,比较熟悉它的用法,而且知道Block可能引起循环引用,今天来聊聊Block,以及Block造成内存泄露的根本原因。首先,Block和普通实例一样是是一个对象,他有自己的isa指针。它就是一个里面存储了指向定义代码块的函数指针和block外部上下文变量信息的结构体。通过断点我们看到block的isa指针,如下图:

Block在iOS日常开发中极其常见,大家应该几乎都使用过,比较熟悉它的用法,而且知道Block可能引起循环引用,今天来聊聊Block,以及Block造成内存泄露的根本原因。

Block是什么

首先,Block和普通实例一样是是一个对象,他有自己的isa指针。

它就是一个里面存储了指向定义代码块的函数指针和block外部上下文变量信息的结构体。通过断点我们看到block的isa指针,如下图:

Block的内存结构

我们发现block的类型其实是不同的,这是为什么呢?接下来我们看看Block到底有哪些类型。

Block的类型

我们通过实际例子看看的各种类型的block

  • NSMallocBlock
- (void)NSMallocBlock {
    int tempInt = 1;
    void (^block)(void) = ^ {
        NSLog(@"----------%d----------\n\n",tempInt);
    };
    block();
    [self printBlockSuperClass:block];
}
复制代码

结果: NSMallocBlock -> __NSMallocBlock -> NSBlock -> NSObject

  • NSStaticBlock
- (void)NSStaticBlock {
    int tempInt = 1;
    __weak void (^block)(void) = ^ {
        NSLog(@"----------%d----------\n\n",tempInt);
    };
    block();
    
    [self printBlockSuperClass:block];
}
复制代码

结果: NSStackBlock -> __NSStackBlock -> NSBlock -> NSObject

  • NSGlobalBlock
- (void)NSGlobalBlock {
    void (^block)(int a) = ^ (int a){
        NSLog(@"----------%d----------\n\n",a);
    };
    block(1);
    
    [self printBlockSuperClass:block];
}
复制代码

结果: NSGlobalBlock -> __NSGlobalBlock -> NSBlock -> NSObject

我们发现:

__weak

属性关键字和外部变量类型对Block内存的影响

为了验证我们定义了三中关键字的block,分别有storng、weak、copy修饰:

@property (nonatomic, strong) TestBlock strongBlock;
@property (nonatomic, weak) TestBlock weakBlock;
@property (nonatomic, copy) TestBlock copyBlock;
复制代码

验证方法如下:

int globalInt = 1000;//全局变量
static staticInt = 10000;//全局静态变量

- (void)blockInMemory {
    static tempStaticInt = 100000;//局部静态变量
    int normalInt = 20000;
    _strongBlock = ^(int tempInt) {
        NSLog(@"tempInt = %d", normalInt);
    };
    _weakBlock = ^(int tempInt) {
        NSLog(@"tempInt = %d", normalInt);
    };
    _copyBlock = ^(int tempInt) {
        NSLog(@"tempInt = %d", normalInt);
    };
    NSLog(@"\nstrongBlock:%@\n_weakBlock:%@\n_copyBlock:%@",object_getClass(_strongBlock),object_getClass(_weakBlock),object_getClass(_copyBlock));
}
复制代码

分别打印不同变量类型(全局变量、全局静态变量、局部静态变量、局部变量)和属性关键字下block的类型,我们可以得出如下结论:

  1. 没有外部变量时,三种Block都是 __NSGlobalBlock__
  2. 有外部变量时,
    2.1 外部变量时全局变量、全局静态变量、局部静态变量时: __NSGlobalBlock__ (全局区)
    2.2 外部变量时普通外部变量:copy和strong修饰的Block是 __NSMallocBlock__ (堆区);weak修饰的block是 __NSStackBlock__ (栈区)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。

大话数据结构

大话数据结构

程杰 / 清华大学出版社 / 2011-6 / 59.00元

本书为超级畅销书《大话设计模式》作者程杰潜心三年推出的扛鼎之作!以一个计算机教师教学为场景,讲解数据结构和相关算法的知识。通篇以一种趣味方式来叙述,大量引用了各种各样的生活知识来类比,并充分运用图形语言来体现抽象内容,对数据结构所涉及到的一些经典算法做到逐行分析、多算法比较。与市场上的同类数据结构图书相比,本书内容趣味易读,算法讲解细致深刻,是一本非常适合自学的读物。 本书以一个计算机教师教......一起来看看 《大话数据结构》 这本书的介绍吧!

MD5 加密
MD5 加密

MD5 加密工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试