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)

用户喜欢...

关于 4G/5G 智能手机天线调谐的 4 点须知

天线效率在智能手机的整体RF性能中发挥着至关重要的作用。然而,当前的智能手机工业设计趋势和RF需求(尤其是即将过渡至5G),意味着智能手机必须要将更多的天线安装到更小的空间内,并...


11关于模拟噪声分析的神话

噪声是模拟电路设计的核心主题,直接影响从测量中提取的信息量以及可以获得所需信息的经济性。不幸的是,存在大量关于噪声的混淆和错误信息,这可能导致性能不佳,过度设计成本过高或...


关于物联网平台生态系统的5件事情

正在进行的物联网平台研究的见解。 我们目前正在目睹全球物联网部署和解决方案的爆炸式增长。物联网平台正在成为这些物联网部署的核心支柱 - 到2023年,物联网平台市场将达到223亿美元。...


时间敏感网络:实时以太网

关于以太网的讨论正在引起对安全数据传输和实时性的不断增长的需求。这就是时间敏感网络(TSN)的问题,它是在IEEE 802时敏网络任务组(TSN TG)框架内开发的几个子标准的组合。目标是通过...


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

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


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

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


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

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


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

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


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

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


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

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