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