文章目录[隐藏]
块的类型
序
屏蔽文佳百科在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是一样的。
标签
本文是一系列板块中的第一篇。由此,我们了解了三种不同类型的积木。接下来,我们将以源代码的形式了解更多关于块的底层实现。下一篇文章再见。
以上就是由优质生活领域创作者 嘉文社百科网小编 整理编辑的,如果觉得有帮助欢迎收藏转发~
本文地址:https://www.jwshe.com/642208.html,转载请说明来源于:嘉文社百科网
声明:本站部分文章来自网络,如无特殊说明或标注,均为本站原创发布。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。分享目的仅供大家学习与参考,不代表本站立场。