知乐空间

Block的类型(block是什么意思)

Block的类型

序

在iOS的日常开发中,Block是极其常见的。大家应该差不多都用过,熟悉它的用法,知道Block可能会引起循环引用。今天,我们来谈谈Block以及Block导致内存泄漏的根本原因。

什么是Block?

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

它是一种结构,其中存储了指向已定义代码块的函数指针和该块的外部上下文变量信息。通过断点,我们可以看到块的isa指针,如下图所示:

我们发现块的类型实际上是不同的,这就是为什么让我们看看有哪些类型的块。

块的类型

让我们通过实际例子来看看各种类型的块。

NSMallocBlock

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

结果:nsmallocblock-_ _ _ _ nsmallocblock-nsblock-n对象

NSStaticBlock

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

结果:NSStackblock-_ _ _ NSStackblock-NSBlock-n对象

NSGlobalBlock

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

结果:nsglobalblock-_ _ _ _ nsglobalblock-nsblock-n对象

我们发现:

当没有外部变量时,block是__NSMallocBlock,它由开发人员创建并存储在堆内存中。

当用__ weak修饰时,该块是__ nsstackblock,存储在堆栈区域中。

当块有参数时(当捕获外部变量时),块是__NSGlobalBlock,它存储在全局区域中。

关键词和外部变量类型对块记忆的影响

为了验证我们已经定义了三个关键字的块,分别有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));复制代码

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

如果没有外部变量,这三种块都是__NSGlobalBlock__

当有外部变量时,

2.1当外部变量为全局变量时,全局静态变量和局部静态变量:__NSGlobalBlock__(全局区域)

2.2外部变量为普通外部变量:复制修改的块,强为__NSMallocBlock__(堆区);弱修改块是__NSStackBlock__(堆栈区域)

具有公共外部变量的块在堆栈区域中创建,当通过复制和强修饰符进行修改时,这些块将从堆栈移动到堆区域。

在ARC下用复制和强关键词修饰区块也是一样的。

标签

这是Block系列的第一篇文章,从中我们了解了三种不同类型的Block。接下来,我们将以源代码的形式深入了解Blocks的底层实现。下次见。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请发送邮件至 ZLME@xxxxxxxx@hotmail.com 举报,一经查实,立刻删除。

留言与评论(共有 0 条评论)
验证码: