本帖最后由 alotofleo2 于 2016-3-18 21:49 编辑
在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指针所以它也是一个对象, 它的最终实现还是一个函数.
|