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。