2018-10-12 iOS中block造成的循环引用

2018-10-12  本文已影响13人  遵天循道

主要还是看self->block->self,会不会产生这样的环。

引自:关于Block内部要不要使用weakSelf的几种情况

iOS中block循环引用问题

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

typedefvoid(^TestBlock)();

@interface SecondViewController ()

@property (nonatomic, copy)TestBlock testBlock;

@end

self.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");

    }

}

上一篇 下一篇

猜你喜欢

热点阅读