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

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

文章目录[隐藏]

块的类型

屏蔽文佳百科在iOS的日常开发中极为常见。大家应该都用过差不多,熟悉它的用法,知道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--> ns block--> ns object

NSStaticBlock

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

结果:NSStackBlock--> _ _ NSStackBlock--> ns block--> ns object

NSGlobalBlock

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

结果:ns global block--> _ _ ns global block--> ns block--> ns object

我们发现:

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

当用__weak修饰时,该块是__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) { NSLo嘉文社百科g(@\"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外部变量时常见的外部变量:copy和strong修改的块是__NSMallocBlock__(堆区);弱装饰块是__NSStackBlock__(堆栈区域)

在堆栈区创建一个带有普通外部变量的块,当被copy和strong修饰符修改时,该块将从堆栈移到堆区。

在ARC下,用copy和strong关键字修饰block是一样的。

标签

本文是一系列板块中的第一篇。由此,我们了解了三种不同类型的积木。接下来,我们将以源代码的形式了解更多关于块的底层实现。下一篇文章再见。

以上就是由优质生活领域创作者 嘉文社百科网小编 整理编辑的,如果觉得有帮助欢迎收藏转发~

相关推荐

四大会计师事务所(四大会计师事务所哪个待遇最好)

四大会计师事务所(四大会计师事务所哪个待遇最好)注册会计师考生看到的世界四大会计师事...

「经验分享」白鹿原田小娥结局是什么

田小娥结局是遭其公公鹿三杀害。《白鹿原》是刘进执导的年代剧。由张嘉译、何冰、秦海璐、...

赚钱了app下载苹果(赚钱了兼职app下载软件)

通过赚钱app下载苹果(通过赚钱兼职app下载软件)好带你去搞副业,那我就不打退堂鼓...

短线炒股技巧(短线交易的三个小技巧)

短线操作是大多数散户最喜欢的操作,实际上也是最难的股市操作。在我个人的字典里,短线品...

三更半夜的三更指的是几点?(成语三更半夜中的三更指的是大概几点)

习语午夜指的是什么时候?想必很多朋友都想知道今天在支付宝蚂蚁庄园的教室里答案是什么。...

民间故事有哪些(三个民间故事,看懂的人少走很多弯路)

民间故事很多,有些能流传下来,都是因为背后有一些道理。理解了这三个故事,你就可以表现...

白醋可以洗脸吗(白醋洗脸真的可以美白祛痘吗)

白醋可以洗脸吗?(白醋洗脸真的能美白祛痘吗?)白醋洗脸真的能美白祛痘吗?白醋洗脸有什...

「重点」mac子弹头和尤雾弹的区别是什么

子弹头系列包含的类型比较多。主要体现在1.丰富的色彩。子弹头系列有一百多种不同的色号...