黑马程序员技术交流社区

标题: 看到一个同学的关于block的问题问的非常全面和大家分享一下 [打印本页]

作者: alotofleo2    时间: 2016-3-18 21:51
标题: 看到一个同学的关于block的问题问的非常全面和大家分享一下



在block内部可以访问外部变量?
可以
放在那个区?
ARC下的非全局block 机制是将外部变量全都copy到它所在的堆区的一个结构体中
怎么修改变量呢?
我们现在一般研究的是ARC下,想要修改外部变量的值,首先得在外部变量的定义类型前加__block ,这时候代码读到block行时,就不再是之前的单纯copy了,而是分别在不同的结构体中创建了一个指针和一个变量(并且将__block的变量值copy给它),当读取到修改变量的代码时,其实底层是讲代码转换成了这个指针去指向新创建的变量的空间(因为堆区不像栈区变量可以直接访问)
修改之后的变量放在那个区?
堆区
还可以继续使用原来变量吗?;
不能
在block内部可以定义变量吗?
可以
定义的变量又放在那个区?
栈区
全局变量和静态变量在block内部可以直接修改吗?
可以
block分几类?
三类
什么是全局block?
第一在所有函数以外的block
什么是栈block?
在MRC下可以是引用外部变量的block,但是ARC下编译器已经没有了栈block而将除了global以外的block都放在了堆区
什么又是堆block?
MRC下 栈block 的copy,但是ARC下都是堆block

最后:总结一下,其实block 只是一个数据结构,这种数据结构在生成时就会将外部的局部变量copy(全局变量不copy)到它自己的某个结构体中
并且这个数据结构中有函数.结构体等
并且在某个结构体中含有一个isa指针所以它也是一个对象,
它的最终实现还是一个函数.




作者: 李凯斌    时间: 2016-3-25 15:17
什么是栈block?

什么又是堆block?

难道不应该是栈block就是创建在栈上的block,堆block就是创建在堆上的block么,还有给block增加_weak,arc下也是栈block,具体可以在xocde中po 一个block可以看到是stacj还是malloc,不过这个没什么实际意义,没人会这么干





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2