首页 > 移动平台 > 详细

iOS中block循环引用问题

时间:2016-08-26 19:56:06      阅读:373      评论:0      收藏:0      [点我收藏+]

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循环引用问题

原文:http://www.cnblogs.com/czc-wjm/p/5811520.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!