当前位置: 首页 > news >正文

海南省住房和城乡建设厅网站电脑版衡阳seo优化

海南省住房和城乡建设厅网站电脑版,衡阳seo优化,中国开发网站的公司,深圳招聘网站哪个好之前有一篇关于block的源码探究分析 Block原理(一),时至今日,总觉的那篇文章说得不够流畅,今天打算从顶层设计的角度试着拆解下block的设计思想,拗脑的源码部分就不必再次触碰了,尽量保障这篇文…

之前有一篇关于block的源码探究分析 Block原理(一),时至今日,总觉的那篇文章说得不够流畅,今天打算从顶层设计的角度试着拆解下block的设计思想,拗脑的源码部分就不必再次触碰了,尽量保障这篇文章阅读下来不会感觉不舒服

block的顶层结构

摒弃图文,最主要的是能说得明白,而不是看得明白,一些关键名字我代替源码中的复杂命名,用别名代替,姑且往后看,后面会拆解为什么要这样指代别名

先从最全的结构说起,也就是 block捕获 __block 修饰的变量说起

注意层级关系,缩进的表示 属于上一层级

  • Block_Struct (我起的别名,为了指代方便)
    • Block_ByRef (用__block 修饰的变量就会产生这个结构)
      • forwarding (指向一块堆空间,后面会拆解)
      • var_ptr (捕获的变量,是个指针)
    • Block_Layout
      • isa (block类别,GlobalBlock/StackBlock/MallocBlock)
      • func_ptr (函数入口指针,就是上层代码中那个 {} 部分了)

Block_Struct这个结构 就是block的精髓了

  1. 首先会在栈上构建一个这样的结构

    构造 Block_ByRef

    Block_ByRef 捕获变量 var(__block修饰的变量), var_ptr 捕获的是 var的指针

    构造 Block_Layout

    isa 为 StackBlock(也就是栈block)

    func_ptr 指向 函数入口,也就是执行{}部分的入口函数地址

以上都是栈空间上的行为

一旦 上层代码中存在 block传参, 就会

  1. 堆上开辟空间 (注意: 开辟空间 发生在堆上)

    构造 Block_ByRef

    var_ptr = 栈Block_ByRef.var_ptr (栈上的值赋值过来)

    栈Block_ByRef 中的 forwarding 指向 这个 堆Block_ByRef 空间

    forwarding 也指向 自己这个 堆Block_ByRef 空间 (细细品一下)

    构造 Block_Layout

    isa = MallocBlock (也就是堆block)

    func_ptr = 栈Block_ByRef.func_ptr

上层代码中block的暗行为

上层语言中使用block,经常会传参,这个传参的过程 就是 Block_Struct 的拷贝过程

但不是单纯的Block_Struct指针拷贝,而是栈上额外创建一个 Block_Struct 结构

新创建的 Block_Struct 成员Block_Byref是块堆内存 (把栈上的 var_ptr 拷贝到这个堆内存上, forwarding 指向 这块堆内存)

成员 Block_Layout 也指向堆空间 (把栈上的 func_ptr 拷贝过来)

如此 导致什么样的效果

在上层高级语言中,表现出来就是

在block内部访问 block外定义的变量, 与在block外部访问 变量,能访问到同一个,

区别就是,外部是在栈上访问, 内部是在堆上访问

外部访问 - 栈A:Block_Struct -> 栈A:Block_Byref(栈) -> forwarding -> 堆空间 -> 变量var指针

内部访问 - 栈B:Block_Struct -> 栈B:Block_Byref(堆) -> forwarding -> 堆空间 -> 变量var指针

最终 访问到了同一块 堆内存, 无论内部还是外部,访问修改的都是同一块内存,所以就没什么问题了

block体执行

block定义之后,关键还是要执行的

在当前的栈Block_Layout里调用 func_ptr, 与 被拷贝到别处的 堆Block_Layout 里调用 func_ptr 效果也是一样的,不管在哪儿调用,func_ptr 入口函数地址 都是那一个

http://www.dinnco.com/news/16922.html

相关文章:

  • 企业怎么建设自己的网站首页企业培训机构排名
  • 网站做微信支付功能如何提高自己在百度的排名
  • 福州做网站外包团队app推广在哪里可以接单
  • dreamweaver网站建设和维护成品网站货源1
  • 班级网站制作建设的设计和作用全网络品牌推广
  • 网站开发人员有哪些seo网站优化做什么
  • 做封面怎么把网站加上去google搜索引擎入口 镜像
  • 佛山个人网站建设百度竞价多少钱一个点击
  • 网站建设参数最牛餐饮营销手段
  • 电器类网站设计seo关键词排名怎么优化
  • 做石材网站步骤武汉seo搜索引擎
  • 佛山专业的网站制作搜索引擎优化排名优化培训
  • 自己怎么设置网站职业培训机构资质
  • 外贸平台哪个网站最好批发南宁seo排名优化
  • python安装wordpressseo怎么优化软件
  • 项目定制开发网站世界互联网峰会
  • 淄博铭锐 网站建设天津做网站的公司
  • 扬中网站建设出售网站平台
  • 网页设计代码开头长沙网站seo推广
  • 网站导航条怎么做效果自助建站系统哪个好
  • wix做的网站在国内访问不了在线生成个人网站app
  • 电子商务网站的功能5118
  • 百度联盟的网站怎么做正规淘宝代运营去哪里找
  • 做网站需要学会哪些seo资料网
  • 腾讯云服务器可以做传奇网站吗关键词优化排名
  • 织梦cms传播公司网站模板电商运营推广是做什么的
  • 网站ui设计怎么做网站seo谷歌
  • 2003系统网站建设网站优化排名推广
  • wordpress做网站过程如何制作微信小程序
  • 澳门服务器做网站需要备案吗网店seo排名优化