close
当前位置: 物联网在线 > 技术文库 > ios >

关于 block 会不会被自动 copy 的实验和猜想

今天群里不知怎么说起了 block 在栈上还是在堆上的问题。好像之前在哪里看到过,现在 block 的属性已经不用写 copy 关键字,就会自动 copy。于是做了几个实验,想看看什么情况下会自动 copy,什么情况下不会~

实验

代码如下:

TestClass.h

typedef void(^SimpleBlock)();   @interface TestClass : NSObject   @property (nonatomic, copy) SimpleBlockcopyProperty;   @property (nonatomic, strong) SimpleBlockstrongProperty;   @property (nonatomic, weak) SimpleBlockweakProperty;   @property (nonatomic, assign) SimpleBlockassignProperty;   @end

main

#import "TestClass.h"   SimpleBlocksomeFunction(SimpleBlockblock) {     NSLog(@"block as param : %@", block);     return block; }   int main(int argc, const char * argv[]) {     @autoreleasepool {           __blockint a = 1;           NSLog(@"orginal block : %@", ^{             a = 2;         });           // as a variable         SimpleBlockblock = ^{             a = 2;         };         NSLog(@"block as variable : %@", block);         __weakSimpleBlockweakBlock = ^{             a = 2;         };         NSLog(@"block as a weak variable : %@", weakBlock);           // as properties         TestClass* testClass = [TestClassnew];         testClass.weakProperty = ^{             a = 2;         };         testClass.assignProperty = ^{             a = 2;         };         testClass.copyProperty = ^{             a = 2;         };         testClass.strongProperty = ^{             a = 2;         };           NSLog(@"copy property : %@", testClass.copyProperty);         NSLog(@"strong property : %@", testClass.strongProperty);         NSLog(@"weak property : %@", testClass.weakProperty);         NSLog(@"assign property : %@", testClass.assignProperty);           NSLog(@"block as return value : %@", someFunction(^{             a = 2;         }));     }     return 0; }

实验结果:

2017-02-06 17:43:36.207212 test2[27378:1079138] orginalblock : 2017-02-06 17:43:36.207436 test2[27378:1079138] blockas variable : 2017-02-06 17:43:36.207457 test2[27378:1079138] blockas a weakvariable : 2017-02-06 17:43:36.207492 test2[27378:1079138] copyproperty : 2017-02-06 17:43:36.207517 test2[27378:1079138] strongproperty : 2017-02-06 17:43:36.207563 test2[27378:1079138] weakproperty : 2017-02-06 17:43:36.207581 test2[27378:1079138] assignproperty : 2017-02-06 17:43:36.207611 test2[27378:1079138] blockas param : 2017-02-06 17:43:36.207769 test2[27378:1079138] blockas return value : 分析

作为变量:

一个 block 刚声明的时候是在栈上

赋值给一个普通变量之后就会被 copy 到堆上

赋值给一个 weak 变量不会被 copy

作为属性:

用 strong 和 copy 修饰的属性会被 copy

用 weak 和 assign 修饰的属性不会被 copy

函数传参:

作为参数传入函数不会被 copy

作为函数的返回值会被 copy

猜测

看着以上结论,感觉可以做出一个猜测:就是 block 被 retain 的时候就会自动被 copy,包括 autoRelease~ 这样就能解释为啥函数的参数不会被 copy,返回值就会被 copy。是不是很有道理呢 =w=


(责任编辑:ioter)

用户喜欢...

关于高压输电的探索:电网换相换流器

据美国能源信息管理局统计,2014年美国能源的平均零售价格为10.44美分/千瓦时,预计输配电损耗为5%。这一损耗值似...


关于人工智能的优缺点 这里有需要知道的10个事实

1.人工智能正在为你的工作而来。为了保护你的职业,最好去做那些机器不擅长的工作——比如说涉及到人、不可预测...


机器学习入门系列:关于机器学习算法你需要了解的东西、如何开发机器学习模型?

作者:Yael Gavish 习概念及其对业务目标的影响是非常重要的。 算法的选择 在问题定义上的一个小变动可能需要有一个...


关于瑞天智能全自动激光打标机的那些事儿

作为电子制造行业规模空前、精英云集的产业盛宴,NEPCON South China 2017(第23届华南国际电子生产设备暨微电子工业展...


德州仪器Juan Alvarez发表关于TI DLP(R)Pico(TM)评估模块的博客

DLP Pico 技术已经扩展到诸多应用领域,包括增强现实、虚拟现实、售后市场平视显示器、移动智能电视、销售点、虚...


关于模拟噪声分析的11个误区,你都中招了吗?

噪声是模拟电路设计的一个核心问题,它会直接影响能从测量中提取的信息量,以及获得所需信息的经济成本。遗憾的是,关于噪声有许多混淆和误导信息,可能导致性能不佳、高成本的过度...


干货:关于云计算的16个问答

由于大型供应商之间的不断竞争,一些云计算服务的费用,尤其是虚拟机器的价格曾持续下降。一些证据表明,其他...


一篇文章解决你所有关于数据分析的问题!

作者:datakong  1. 数据分析多层模型介绍 这个金字塔图像是数据分析的多层模型,从下往上一共有六层: 底下第一层...


关于云计算最新趋势的讨论

无论是供应商合作还是物联网的新服务,云计算市场迅速发展。以下是五个播客的综述,可以帮助人们了解快最新的...


关于Docker里面的几个主要概念

如何从容器构建镜像(把现有系统制作成ghost文件),和如何使用Dockerfile构建镜像(使用脚本生成ghost文件)。...