- 首先感谢八点钟学院分享宝贵的知识!
- 为什么是部分,因为阅读过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
- 普通外部变量,copy、strong修饰的block在堆区mallocBlock,weak修饰的block在栈区stackBlock,并且在当前函数外调用weak修饰的block会崩溃,因为此block在栈区!
image.png
image.png
- 普通外部变量,copy、strong修饰的block在堆区mallocBlock,weak修饰的block在栈区stackBlock,并且在当前函数外调用weak修饰的block会崩溃,因为此block在栈区!
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没有区别
网友评论