Block 循环引用 深入之 __weak 和 __strong
2016-04-04 本文已影响142人
KNSky
/***********************************************/
在ViewController.m 中代码如下
@implementation ViewController
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
[self presentView];
}
-(void)presentView{
//创建控制器
ModalViewController *modalVC=[[ModalViewController alloc] init];
modalVC.view.backgroundColor=[UIColor cyanColor];
//modal 到上面创建的控制器
[self presentViewController:modalVC animated:YES completion:nil];
}
- (void)viewDidLoad {
[super viewDidLoad];
//设置颜色方便自己点击
self.view.backgroundColor=[UIColor cyanColor];
}
@end
/***********************************************/
Block 的概念
堆立面的block(被copy过的block)有以下现象
1==> block内部如果通过外面声明的强引用来使用,那么block内部会自动产生一个强引用指向所使用的对象。
2==> block内部如果通过外面声明的弱引用来使用,那么block内部会自动产生一个弱引用指向所使用的对象。
在ModalViewController.m 中代码如下
@interface ModalViewController ()
//声明block
@property(nonatomic,strong)void(^block)();
@end
@implementation ModalViewController
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
[self dismissViewControllerAnimated:YES completion:nil];
}
-(void)dealloc{
NSLog(@"对象销毁");
}
- (void)viewDidLoad {
[super viewDidLoad];
//把self 由强转成弱的
__weak typeof(self) weakSelf=self;
self.block=^{
//self.block 复制一个 weakSelf 弱指针
NSLog(@"1111%@",weakSelf);
//这里启用 复制的弱指针 转化成 强指针 局部的,这里是新转化来的,不会被上面的block影响;
__strong typeof(weakSelf) strongSelf=weakSelf;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(),
^{
//转化成一个局部强指针 他就 复制强指针 [对象有强引用就不会被销毁,会执行到他释放]
//dispatch_after 复制一个 strongSelf 弱指针
NSLog(@"222==%@",strongSelf);
//如果不转化成一个局部强指针 那么他就 复制弱指针 [对象没被强引用就销毁]
//dispatch_after 复制一个 weakSelf 弱指针
//NSLog(@"333=%@",weakSelf);
});
};
self.block();
}
@end