block主要有三种类型:全局block、栈block、堆block
1.__NSGlobalBlock__
:全局block,存储在全局
void(^block)(void) = ^{
NSLog(@"CJL");
};
NSLog(@"%@", block);
此时的block无参无返回值,属于全局block。
2.__NSMallocBlock__
:堆区block,因为block既是函数,也是对象
int a = 10;
void(^block)(void) = ^{
NSLog(@"CJL - %d", a);
};
NSLog(@"%@", block)
此时的block会访问外界变量,即底层拷贝a,所以是堆区block
3.__NSStackBlock__
:栈区block
栈区block,栈区block在iOS14后,越来越少,因此需要使用__weak
使其不在强持有。
int a = 10;
void (^__weak block)(void) = ^{
NSLog(@"block - %d!",a);
};
NSLog(@"%@",block);
<__NSStackBlock__: 0x7ffeeba41478>
全局访问外界变量强引用变成堆区,弱引用变成栈区。
解决block循环引用常见三种方式: