在iOS中Block有三种形式:
1、void(^MTBlock)(void)=^{ };这样定义的block为全局block,不管是不是使用__week修饰;打印NSLog(@"MTBlock=%@",MTBlock);输出:MTBlock=<__NSGlobalBlock__: 0x108cb2a58>;
2、inta=10;void(^MTBlock)(void)=^{ NSLog(@"MTBlock1=%d",a); };当我们在block里面引用外部变量的时候,block变为堆区block;NSLog(@"MTBlock=%@",MTBlock);输出:MTBlock=<__NSMallocBlock__: 0x600001050390>;
3、void(^__weak MTBlock)(void)=^{ NSLog(@"MTBlock1=%d",a); };这里使用__week修饰block,并在内
部调用了外部变量为栈区block;NSLog(@"MTBlock=%@",MTBlock);输出:MTBlock=<__NSStackBlock__: 0x7ffee6fcbb50>;
4、block的循环引用,当A持有B,B释放,A也就相应释放了;但是当A持有B,B也持有A,A、B互相持有,相互等待释放,最终二者都得不到释放造成循环引用;
5、解决循环引用,如果block内没有block,那么直接使用__week typeof(self)即可解决循环引用问题;如果block内部有block,这里block内使用__strong typeof(self) strongSelf = self;这里的strongSelf相当于一个临时变量,在block的作用域内当block执行完就会释放strongSelf,这种方式属于打破block对self的强引用;
网友评论