首页 > 代码库 > iOS中block循环引用问题

iOS中block循环引用问题

1、block是控制器对象的一个属性,则在block内部使用self将会引起循环应用

typedef void(^TestBlock)();@interface SecondViewController ()@property (nonatomic, copy)TestBlock testBlock;@endself.testBlock = ^()  {      NSLog(@"%@",self.mapView);  };  self.testBlock();

2、把block内部抽出一个作为self的方法,当使用weakSelf调用这个方法,并且这个方法里有self的属性,block不会造成内存泄露

self.testBlock = ^(){       [weakSelf test];};-(void)test{    NSLog(@"%@",self.mapView);}

3、当block不是self的属性时,block内部使用self也不会造成内存泄露

TestBlock testBlock = ^(){      NSLog(@"%@",self.mapView);};[self test:testBlock];

4、当使用方法有block作为参数使用时,block内部使用self也不会造成内存泄露

- (void)viewDidLoad {    [super viewDidLoad];  [self getData:^(NSString *str){      NSLog(@"%@----%@", self, str);  }];       [[self class] getData:^(NSString *str) {       NSLog(@"类方法--%@---%@", self, str);   }];}- (void)getData:(SuccessBlock)success{    if (success) {        success(@"success");    }}+ (void)getData:(SuccessBlock)success{    if (success) {        success(@"success");    }}

 

iOS中block循环引用问题