美文网首页
Block 循环引用 深入之 __weak 和 __strong

Block 循环引用 深入之 __weak 和 __strong

作者: KNSky | 来源:发表于2016-04-04 10:18 被阅读142次
    
    /***********************************************/
    在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
    

    相关文章

      网友评论

          本文标题:Block 循环引用 深入之 __weak 和 __strong

          本文链接:https://www.haomeiwen.com/subject/fqwulttx.html