美文网首页
ios中的Block

ios中的Block

作者: 落魄的iOS程序员 | 来源:发表于2021-03-26 21:14 被阅读0次

    在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的强引用;

    相关文章

      网友评论

          本文标题:ios中的Block

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