【高级iOS】block部分原理讲解

  • 首先感谢八点钟学院分享宝贵的知识!
  • 为什么是部分,因为阅读过block源码,很多要结合clang编译成c++来反复推敲和解读,用文字实在不好组织表达。

1.探索

block是一个oc对象吗?

  • 第一种情况,一个普通block,并且在block内部使用一个外部的变量
  • 注意_xxx _为本类,__xxx为父类,是不同的类
    image.png
  • 在原block前加个weak修饰看看,嗯变成栈区block了


    image.png
  • 第三种,一个正常block,也没有外部的参数和weak修饰,带了个自己的参


    image.png
  • 最后得知block是一个oc对象,并且有三种集成体系


    image.png
  • 从英语命名中可以推测,三种block分别在堆区、栈区、全局区(事实也是如此)

2 .copy、strong、weak修饰的block,在有没有外部变量的情况下,来打印出他们所属的类是什么

  • 定义三种不同修饰符的block,来细究


    image.png
  • 在没有外部变量的情况下,三种block都是globalBlock


    image.png
  • 一般而言,在函数外打印weak修饰的变量是nil,但是block虽然是weak修饰,在函数外依旧有值因为我们从上面得知此时的block属于global全局区

    image.png

  • 如果block有外部变量有两种情况

  • 1.全局变量、全局静态变量、局部静态变量 ,无论使用哪一种都在全局区globalBlock


    image.png
    1. 普通外部变量,copy、strong修饰的block在堆区mallocBlock,weak修饰的block在栈区stackBlock,并且在当前函数外调用weak修饰的block会崩溃,因为此block在栈区!
      image.png

      image.png

3. 结论

  • 1.没有外部变量的情况下,block属于全局区 globalBlock
  • 2 有外部变量的情况下
    2.1 无论全局变量、全局静态变量、局部静态变量,block依然在全局区 globalBlock
    2.2 普通外部变量 ,copy、strong修饰的block在堆区mallocBlock,weak修饰的block在栈区stackBlock
    本质:有普通外部变量的block,它创建后就是在栈区,只是copy、strong修饰的block会把它从栈区移动到堆区,而weak不会。
    在arc下copy、strong修饰的block没有区别
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容