Block是什么意思(块的类型)
块的类型前言
块在iOS的日常开发中非常常见 。大家应该差不多用 。他们熟悉它的用法,知道Block可能导致循环引用 。今天我们来谈谈Block以及Block导致内存泄漏的基本原因 。
什么是Block
首先,Block是一个像普通实例一样的对象,它有自己的isa指针 。
它是一种结构,其中存储了指向已定义代码块的函数指针以及块外高文本变量和低文本变量的信息 。通过断点,我们可以看到块的isa指针,如下图所示:
![Block是什么意思(块的类型)](http://img.jiangsulong.com/220730/0250404547-0.jpg)
文章插图
我们发明的block的类型实际上是不同的,这就是为什么我们要看Block是什么类型 。
块的类型
我们通过实例来看各种类型的块
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];}复制代码成绩:nsstack block->:_ _ nsstack block->;NSBlock->;n对象
NSGlobalBlock
- (void)NSGlobalBlock { void (^block)(int a) =&n资源网bsp;^ (int a){ NSLog(@"----------%d----------\n\n",a); }; block(1);[self printBlockSuperClass:block];}复制代码成绩:NSGlobalBlock->:_ _ NSGlobalBlock->;NSBlock->;n对象
我们发明了:
当没有外部变量时,块是__NSMallocBlock,由开发人员创建并存储在堆内存中 。
【Block是什么意思(块的类型)】块是__NSStackBlock,当有_ _弱整理时,存储在堆栈区 。
当block有参数时(捕获外部资源网络变量时),block是__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外部变量为普通外部变量:复制打磨且强的Block为__NSMallocBlock__(堆区);弱抛光的块是__NSStackBlock__(堆叠区域)
在堆栈区域创建带有公共外部变量的块 。当它被复制和强修饰修饰时,它会将块从堆栈移动到堆区域 。
在ARC下,用copy和strong打磨块是一样的 。
标签
这是block系列的第一篇文章,从中我们知道了Block的三种不同类型,然后我们将通过使用源代码的方法深入了解Block的底层实现 。我们下次再见 。
推荐阅读
- 什么是子网掩码(子网掩码和ip地址是什么关系?)
- 菠萝会生气吗(菠萝的禁忌是什么)
- 地图是什么意思(地图,到处都是flatMap,什么意思?)
- iqoo是什么牌子手机中文怎么读 iqoo是什么牌子手机
- 我的世界的指令是什么 我的世界指令有哪些
- 忽如一夜春风来千树万树梨花开是什么季节 忽如一夜春风来千树万树梨花开是什么意思
- 我rushb了是什么梗 Rush B是什么梗
- 平板电脑跟笔记本电脑有什么区别 平板电脑和笔记本电脑的区别是什么
- 天然气灶不打火原因及维修办法 燃气灶不打火原因及维修办法是什么
- 五行路旁土命是什么意思 路旁土命是什么意思