Block(二)内存管理与其他特性-b
2017-12-25 10:32
423 查看
一、block放在哪里
我们针对不同情况来讨论block的存放位置:1.栈和堆
以下情况中的block位于堆中:2.全局区
以下情况中的block位于全局区:需要注意的是,这里复制过后的block依旧位于全局区,实际上,复制操作是直接返回了原block对象。
二、block引用的变量在哪里
1.全局区
全局区的变量存储位置与block无关:注意,static变量是不允许添加__block标记的
2.堆栈
首先,我们在栈上创建了变量ij,并赋予初始值,然后创建一个block变量名为blk,但未赋值。
然后我们初始化这个blk,赋值为一个只有一句printf的block,值得注意的是,一个block一旦创建,其引用到的常规变量会进行如下操作:
没有__block标记的变量,其值会被复制一份到block私有内存区
有__block标记的变量,其地址会被记录在block私有内存区
然后调用blk,打印1024, 1很好理解
接下来复制blk到堆,名曰blkInHeap,调用之,打印1024, 1也很好理解
接下来我们为ij增值,使其变为1025和2,此时再调用blk或者blkInHeap,会发现结果为1025, 1,这是因为变量j早已在创建原始的block时,被赋值进block的私有内存区,后续对i的操作并非操作的私有内存区的复制品,当调用blk或者blkInHeap时,其打印使用的是私有内存区的复制品,故而打印结果依旧为1;而变量j的修改会实时生效,因为block记录的是它的地址,通过地址来访问其值,使得外部对j的修改在block中得以生效。对于变量i来讲,可算是物是人非吧?
因此,无论j++这一句放到blk()这句之前或者之后,只要它位于block初始化之后,这段代码执行的控制台打印结果都会是:1024, 1。而不是1024, 2(假设不调用i++)
相关文章推荐
- iOS中Block介绍 内存管理与其他特性
- Block介绍(二)内存管理与其他特性
- iOS中Block介绍(二)内存管理与其他特性
- Block:内存管理与其他特性
- iOS中Block介绍(二)内存管理与其他特性
- Block介绍(二)内存管理与其他特性
- iOS中Block介绍(二)内存管理与其他特性
- iOS中Block介绍(二)内存管理与其他特性
- iOS中Block介绍(二)内存管理与其他特性
- iOS中Block介绍(二)内存管理与其他特性
- Block介绍(二)内存管理与其他特性
- Block介绍(二)内存管理与其他特性
- Block介绍(二)内存管理与其他特性
- Block介绍(二)内存管理与其他特性
- iOS中Block介绍(二)内存管理与其他特性
- Block介绍(二)内存管理与其他特性
- iOS中Block介绍(二)内存管理与其他特性
- iOS中Block介绍(二)内存管理与其他特性
- Block介绍(二)内存管理与其他特征
- Object-C Block 内存管理与其他特性