美文网首页
梳理易引起retain-cycle的场景(使用block)

梳理易引起retain-cycle的场景(使用block)

作者: 4VZhang | 来源:发表于2017-08-03 11:17 被阅读8次
  • 开发以及面试中,经常涉及到使用block的需要注意的问题----循环引用,趁此时机梳理相关block引起循环引用的场景:
  1. 使用通知(notification) 系统自带的block方法,在block中使用self-->会发生循环引用
TwoVC  .m文件

-(void)dealloc {
    NSLog(@"%s",__func__);
}

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor orangeColor];
    // Do any additional setup after loading the view.
    //__weak typeof(self) weakSelf = self; //弱引用
    [[NSNotificationCenter defaultCenter] addObserverForName:@"testBlock" object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification * _Nonnull note) {
        //__strong typeof(self) strongSelf = weakSelf;
        NSDictionary *userInfo = note.userInfo;
        NSLog(@"userInfo--%@ -- self.view - %p",userInfo,self.view);
    }];
}

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    [[NSNotificationCenter defaultCenter] removeObserver:self];
    NSLog(@"%s",__func__);
}

控制台输出

2017-08-02 17:09:31.131 testBlock[36251:3586073] userInfo--{
    Project = testNotificationBlock;
} -- self.view - 0x7fff0b501980
2017-08-02 17:09:34.073 testBlock[36251:3586073] -[TwoVC viewWillDisappear:]
结论: 当前VC没有被释放,添加弱引用后,VC被释放掉;存在retain-cycle
  1. 使用MJRefresh框架中返回上下拉刷新的block方法,在block中使用self-->会发生循环引用
ThreeVC  .m文件

-(void)dealloc {
    NSLog(@"%s",__func__);
}

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    self.view.backgroundColor = [UIColor whiteColor];
    self.tableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain];
    [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"cell"];
    self.tableView.dataSource = self;
//    __weak typeof(self) weakSelf = self;//(弱引用)
    self.tableView.mj_header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{
//        __strong typeof(self) strongSelf = weakSelf;
        NSLog(@"MJrefresh --下拉刷新");
        [[NSNotificationCenter defaultCenter] postNotificationName:@"testBlock" object:nil userInfo:@{@"Project":@"testNotificationBlock"}];
        [self endrefresh];

    }];
    [self.tableView.mj_header beginRefreshing];
    
    [self.view addSubview:self.tableView];
}

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    NSLog(@"%s",__func__);
}

控制台输出

2017-08-03 10:39:44.381 testBlock[37278:3717266] MJrefresh --下拉刷新
2017-08-03 10:39:44.382 testBlock[37278:3717266] userInfo--{
    Project = testNotificationBlock;
} -- self.view - 0x7f8747406440
2017-08-03 10:39:55.641 testBlock[37278:3717266] -[ThreeVC viewWillDisappear:]
结论: 当前VC没有被释放,添加弱引用后,VC被释放掉;存在retain-cycle

3.强引用自定义的属性block,并在block中使用self-->,会引起循环引用

/** block */
@property (nonatomic, copy) void(^myblock)();

@end

@implementation FourVC

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor yellowColor];
    _myblock = ^ {
        NSLog(@"--%p",self.view);
    };
    _myblock();
}

控制台输出

2017-08-03 11:17:51.409 testBlock[37510:3750978] --0x7f8e7d70b460
2017-08-03 11:17:55.696 testBlock[37510:3750978] -[FourVC viewWillDisappear:]
结论: 1)报警告 2)当前VC没有被释放,添加弱引用后,VC被释放掉;存在retain-cycle

未完待续,欢迎指正/添加
测试代码奉上

相关文章

  • 梳理易引起retain-cycle的场景(使用block)

    开发以及面试中,经常涉及到使用block的需要注意的问题----循环引用,趁此时机梳理相关block引起循环引用的...

  • block开发中使用场景

    block 开发中使用场景 适合新手理解 熟悉 运用到项目中 block开发中使用场景 1.把block保存到对象...

  • iOS开发 循环引用的几种场景

    delegate 循环引用如果delegate使用strong修饰容易引起循环引用 block 循环引用block...

  • Block使用场景

    引言 最近在研究RAC的时候,发现绝大部分代码实现如下所示: 可以发现是block嵌套使用,这是使用block实现...

  • @strongify@weakify

    @strongify以及@weakify宏命令的使用场景和原理 主要是在block中使用 (因为block一般都在...

  • block导致循环引用的问题

    通常block中使用self,都会引起循环引用。 1)但是并不代表所有的block中使用self都会造成循环引用。...

  • block的简单使用

    block的使用场景 1.把block保存到对象中,恰当时机的时候才去调用2.把block当做方法的参数使用,外界...

  • Block的三种应用场景

    block开发中使用场景1.把block保存到对象中,恰当的时候才去调用2.把block当做方法的参数使用,外界不...

  • Block开发中使用场景

    block开发中使用场景 1.把block保存到对象中,恰当时机的时候才去调用 2.把block当做方法的参数使用...

  • __block底层原理详解

    _我们先通过一个小场景,开始今天的主题. 一:__block的本质 我们把使用__block修饰的的block转换...

网友评论

      本文标题:梳理易引起retain-cycle的场景(使用block)

      本文链接:https://www.haomeiwen.com/subject/fcaelxtx.html