
Block本质上也是一个OC对象,他内部也有一个isa指针。Block是封装了函数调用以及函数调用环境的OC对象。
Block三种类型
类型 | 存储区域 |
---|---|
GlobalBlock | 数据区 |
StackBlock | 栈区 |
MallocBlock | 堆区 |
Block避免循环引用的三种方式
1、利用 __weak
和__strong
__weak typeof(self) weakSelf = self;
self.block = ^{
__strong typeof(self) strongSelf = weakSelf;
NSLog(@"%@", NSStringFromCGRect(strongSelf.view.frame));
};
self.block();
2、利用造成循环引用的临时变量
__block ViewController *vc = self;
self.block = ^{
NSLog(@"%@", NSStringFromCGRect(vc.view.frame));
vc = nil;
};
self.block();
3、直接声明Block中添加造成循环引用的参数
typedef void(^Block)(UIViewController *vc);
self.block = ^(UIViewController *vc){
NSLog(@"%@", NSStringFromCGRect(vc.view.frame));
};
self.block(self);
网友评论