专栏首页雨尘分享Block 小结block  的 储存位置block  的循环引用

Block 小结block  的 储存位置block  的循环引用

block 实质值是一个结构体的指针

当我们在block内部调用一个局部变量  当改变这个局部变量的值是没有办法影响到 block内部的值的  因为block的底层实现是传入block的一个常量值.

static    __block 修饰的  当我们调用一一个静态变量 全局变量  我们在block 调用之前修改的之变量的值 会影响到block 中的这些常量的值  因为 block 的底层是传入了这个值 的 指针地址

block  的 储存位置

__NSGlobalBlock__

当我们什么都不做的时候 还是引入的是静态变量 或者 全局变量  这个时候 我们的block是在全局静态区的  也就算常量区 (这个时候内存是系统自己管理的 当程序结束的时候就会释放掉 回收资源)

__NSStackBlock__  栈区

当我们在block中引入局部变量(基础类型 对象类型)那么此时我们的Block 在栈区   不用我们管理 出了这个函数大括号就释放掉了

__NSMallocBlock__  堆区

当前栈区的block 经过copy  后 block就会存储在堆区 这个copy :作用的 将栈区的block 拷贝到堆区 (开发人员管理 内存)

block  的循环引用

当我们把block拷贝到堆区的时候 block 会对内部 调用的对象 引用计数加1 因此会引发内存问题

解决方法 第一种方法 Block_release() 发放对该block 进行释放  在block释放的时候里面调用的对象的引用计数就会减一

第二种方法 __block修饰该对象 这个对象的引用计数就不会加一了


我们的block 中调用self.age 此时 我们的block在栈区

当我们的block 调用属性copy block  在堆区

我们在mian.m person  的引用计数为2 release 后 引用计数变为 1 此时 person 不会被销毁

为于堆区的block 也没有办法 调用到person.m 中的dealloc 方法 因此引用计数也为1

解决办法

__block 在MRC下对对象self修饰  __weak 在ARC下对对象self修饰  此时对象的引用计数就不会再加一了

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 5.Block的内存管理 内存管理内存管理block的循环引用

    陈雨尘
  • 4.Block的类型

    陈雨尘
  • 3. __block  __weak  __strong   这都是做什么的

    陈雨尘
  • iOS block的一些理解和注意点

    大壮
  • 编译器 bug 系列(1)

    作为客户端开发者,我们每天都在接触编译器带来的便利,避免了手写机器码的麻烦,但是,某些情况下,编译器也会代码很多负面的作用。

    酷酷的哀殿
  • 细说 MySQL 之 MEM_ROOT

    这篇文章会详细解说MySQL中使用非常广泛的MEM_ROOT的结构体,同时省去debug部分的信息,仅分析正常情况下,mysql中使用MEM_ROOT来做内存分...

    哲洛不闹
  • 编码篇-Block里面的小天地

    Block是iOS4.0+ 和Mac OS X 10.6+ 引进的对C语言的扩展,用来实现匿名函数的特性。 通常来说,block都是一些简短代码片段的封装,适...

    進无尽
  • iOS底层原理总结 - 探寻block的本质(一)

    xx_Cc
  • 【iOS】block小记

    VV木公子
  • 5.Block的内存管理 内存管理内存管理block的循环引用

    陈雨尘

扫码关注云+社区

领取腾讯云代金券