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)

用户喜欢...

关于驱动设备的调试和移植的一些经验总结

对设备驱动最通俗的解释就是驱使硬件设备行动。设备驱动与底层硬件直接打交道,按照硬件设备的具体工作方式读写设备寄存器,完成设备的轮询、中断处理、DMA 通信,进行物理内存向虚拟...


2018年关于混合云市场的5大预测

尽管公有云看似主导着全球云计算市场,吸引了大部分的注意力,但私有云和混合云市场也在不断壮大。根据专家预...


关于云安全的三个鲜为人知的秘密

设备保护、网络安全、用户行为是安全的三个要素,每个要素都是确保云安全的一个组成部分。它们是包含服务器本...


前途光明的机器学习将走向何方?这里有 5 个关于它的未来预测

机器学习目前是 IT 领域最热门的话题之一,这是因为它在看似无限的应用场景中都能发挥自身的作用。从检测欺诈网站到自动驾驶汽车,再到识别你的“金牌会员”身份以进行价格预测等等...


关于工业物联网您可能会问自己的3个关键问题

您可能已经听到了当今制造业的建议:制造商必须急于采用技术创新来提高生产力,以保持竞争力。这就是为什么工业4.0计划和物联网(IoT)引起了业界对数据驱动型企业收益的关注。预计未来...


深度长文:关于AI,你最该了解可也许从没想过的四个问题

在过去的几年里,我们一直在讨论人工智能(AI)将如何拯救或摧毁世界:自驾车有利于保护我们的生命; 社交媒体泡沫将破坏民主;机器烤面包机会让人类连烤面包的能力都丧失。 你可能很...


xilinx vivado zynq pldma设计及应用block design

这个设计是根据avnet的PL dma带宽测试程序修改过来的,只使用了其中的HP0一个PLDMA。分为两个部分进行设计,第一部分是关于vivado中的block design部分,就是通过ip进行设计。第二部分是PLDMA的源码...


关于PowerVR 25周年发展的行业展望

在我们庆祝PowerVR 25周年活动的同时,我们也会关注行业内人士的一些看法,从那些一开始就研究该技术的工程师到那些将最新技术集成到他们产品上的工程师们。 Simon Fenney是PowerVR部门的一名...


深度解读关于单片机的车用数字仪表系统技术

在汽车的仪表板上安装有各种仪表、指示灯及报警灯,用于帮助驾驶人观察和掌握汽车及各系统的工作情况,提示异常现象和故障,以便及时消除安全隐患。 汽车仪表是用以监测汽车各系统...


单片机设计:关于软件UART的设计思想

目前扩展串口的方法主要有以下方法, ①、采用串口扩展芯片实现,如ST16C550、ST16C554、SP2538、MAX3110等,虽然成本较高, 但系统的可靠性得到了保证,适用于数据量较大、串口需求较多的系统...