ARC 下还有 __NSStackBlock__ 吗
Tags
iOS
Date
Sep 6, 2021
答案是有的。
 
以下这种情况,在 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__。
notion image
但在 Sep 6, 2021 这一天突然发现,这种 block 作为函数参数的情况也已经被 ARC 自动复制到堆了,应该是为了更加安全。
 
notion image
 
编译环境
  • Xcode 12.5.1
  • Apple clang version 12.0.5 (clang-1205.0.22.11)
 
后来与群里大佬交流时发现,这个优化(bug fix)确实是最近一年 llvm 的改动
 
相关链接

Loading Comments...