答案是有的。
以下这种情况,在 MRC 和 ARC 下都是 __NSStackBlock__ 。
int a = 10; NSLog(@"%@", [^{a;} class]);
ARC下,block 在赋值给强引用时会复制到堆上成为 __NSMallocBlock__ 。
那赋值给弱引用呢?还是 __NSStackBlock__。
int a = 10; __weak void(^block)(void) = ^{a;}; NSLog(@"%@", block);
现在再来看一个。
int a = 10; NSLog(@"%@", ^{a;});
在一年之前或更久的博客中,随处可见,这也是 __NSStackBlock__。
但在 Sep 6, 2021 这一天突然发现,这种 block 作为函数参数的情况也已经被 ARC 自动复制到堆了,应该是为了更加安全。
编译环境
- Xcode 12.5.1
- Apple clang version 12.0.5 (clang-1205.0.22.11)
后来与群里大佬交流时发现,这个优化(bug fix)确实是最近一年 llvm 的改动。
相关链接
Loading Comments...