代码改变世界

ios - block循环引用Demo示例

2016-05-04 00:18  菜鸟Alex  阅读(440)  评论(0编辑  收藏  举报

当实例变量中有了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来解决