Block 循环引用 深入之 __weak 和 __strong 的问题


/***********************************************/
在ViewController.m  中代码如下


@implementation ViewController

-(void)touchesBegan:(NSSet *)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 *)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

你可能感兴趣的:(Block 循环引用 深入之 __weak 和 __strong 的问题)