其他iOS

Block嵌套导致的循环引用

2019-05-21  本文已影响0人  哦呵呵y
        self.obj.block = ^(NSInteger index) {
            [Person createWithBlock:^(NSInteger index) {
                NSLog(@"123123=----%@", self);
            }];
        };

self -> obj -> block
这种情况会导致self与block的循环引用

struct __Test__init_block_impl_1 {
  struct __block_impl impl;
  struct __Test__init_block_desc_1* Desc;
  Test *__strong weakSelf;
  __Test__init_block_impl_1(void *fp, struct __Test__init_block_desc_1 *desc, Test *__weak _weakSelf, int flags=0) : weakSelf(_weakSelf) {
    impl.isa = &_NSConcreteStackBlock;
    impl.Flags = flags;
    impl.FuncPtr = fp;
    Desc = desc;
  }
};

((void (*)(id, SEL, CheckProtocolBlock))(void *)objc_msgSend)((id)((Person *(*)(id, SEL))(void *)objc_msgSend)((id)self, sel_registerName("obj")), sel_registerName("setBlock:"), ((void (*)(NSInteger))&__Test__init_block_impl_1((void *)__Test__init_block_func_1, &__Test__init_block_desc_1_DATA, self, 570425344)));

根据clang命令生成的c++代码来看,在第一步为obj.block赋值的时候就会将self作为参数传递进去,而此时的self是__strong描述的。
虽然第一层block并没有直接使用self,但是还是造成了循环引用。
所以在这种情况下,也应该使用 weakSelf。

上一篇下一篇

猜你喜欢

热点阅读