iOS中block循环引用问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS中block循环引用问题相关的知识,希望对你有一定的参考价值。

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

typedef void(^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");
    }
}

 

以上是关于iOS中block循环引用问题的主要内容,如果未能解决你的问题,请参考以下文章

iOS Block循环引用精讲

iOS 中Block的理解以及啥时候会引起循环引用

iOS底层探索之Block——如何解决Block循环引用问题?

iOS 面试题:block 什么时候需要构造循环引用 --转自唐巧

iOS内存管理--Block属性用copy修饰 & 避免循环引用的问题

block-循环引用