zoukankan      html  css  js  c++  java
  • ios

    当实例变量中有了block属性,并且用copy来修饰,但是当调用block中的代码的时候,如果block中运用了self.属性的时候回造成循环引用.

    
    //
    //  ViewController.h
    //  block循环引用
    //
    //  Created by 裴波波 on 16/5/3.
    //  Copyright © 2016年 裴波波. All rights reserved.
    //
    
    #import <UIKit/UIKit.h>
    
    /** 定义一个block的类 */
    typedef int(^PBlcok)(int a,int b);
    
    @interface ViewController : UIViewController
    
    /** 属性中含有PBlcok类型的block */
    @property (nonatomic, copy) PBlcok block;
    
    
    @property (nonatomic, copy) NSString *name;
    
    @end
    
    

    .m中

    
    //
    //  ViewController.m
    //  block循环引用
    //
    //  Created by 裴波波 on 16/5/3.
    //  Copyright © 2016年 裴波波. All rights reserved.
    //
    
    #import "ViewController.h"
    
    @interface ViewController ()
    
    
    @end
    
    @implementation ViewController
    
    
    -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    
        /** 用__weak修饰self避免循环引用 */
    //只要你在block内部使用了self所拥有的任何东西,例如属性,都会造成循环引用
        __weak typeof(self) weakself = self;
        self.block = ^(int a,int b){
            weakself.name = @"pbb";
            NSLog(@"%d",a + b);
            return a + b;
        };
        self.block(2,3);
    }
    
    
    - (void)viewDidLoad {
        [super viewDidLoad];
    }
    
    @end
    
    

    block被copy后,内部出现self则会对其强引用.ARC下用__weak来解决,MRC下用__block来解决

  • 相关阅读:
    Puzzle, ACM/ICPC World Finals 1993, UVa227
    Puzzle, ACM/ICPC World Finals 1993, UVa227
    All in All, UVa 10340
    All in All, UVa 10340
    Box, ACM/ICPC NEERC 2004, UVa1587
    Box, ACM/ICPC NEERC 2004, UVa1587
    动态文本输出
    形态分析法
    粒子系统
    思维
  • 原文地址:https://www.cnblogs.com/adampei-bobo/p/5457007.html
Copyright © 2011-2022 走看看