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");
    }
}

 

posted @ 2016-08-26 19:06  夜晚看日出  阅读(1186)  评论(0编辑  收藏  举报