内容简介: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
- 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的类型,我们可以得出如下结论:
- 没有外部变量时,三种Block都是
__NSGlobalBlock__
- 有外部变量时,
2.1 外部变量时全局变量、全局静态变量、局部静态变量时:__NSGlobalBlock__
(全局区)
2.2 外部变量时普通外部变量:copy和strong修饰的Block是__NSMallocBlock__
(堆区);weak修饰的block是__NSStackBlock__
(栈区)
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 详解Oracle实例内存结构和进程结构
- JAVA内存结构解析
- Java 内存模型和 JVM 内存结构真不是一回事
- JVM启动流程和内存结构
- 原 荐 Redis 哈希结构内存模型剖析
- 深入理解 JVM 之 JVM 内存结构
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
面向对象分析与设计
Grady Booch、Robert A. Maksimchuk、Michael W. Engel、Bobbi J. Young、Jim Conallen、Kelli A. Houston / 王海鹏、潘加宇 / 人民邮电出版社 / 2009-8 / 79.00元
《面向对象分析与设计(第3版)》是UML创始人Grady Booch的代表作之一,书中介绍的概念都基于牢固的理论基础。同时,《面向对象分析与设计(第3版)》又是一本注重实效的书,面向架构师和软件开发者等软件工程实践者的实际需要。《面向对象分析与设计(第3版)》通过大量例子说明了基本概念,解释了方法,并展示了在不同领域的成功应用。全书分为理论和应用两部分。理论部分深刻剖析了面向对象分析与设计(OOA......一起来看看 《面向对象分析与设计》 这本书的介绍吧!