Skip to content

Commit 124126f

Browse files
committed
修改38题,为加深对__block原理的理解,添加描述:栈区是红灯区。
1 parent f5f989c commit 124126f

File tree

1 file changed

+3
-3
lines changed

1 file changed

+3
-3
lines changed

01《招聘一个靠谱的iOS》面试题参考答案/《招聘一个靠谱的iOS》面试题参考答案(下).md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -672,7 +672,7 @@ autoreleasepool 以一个队列数组的形式实现,主要通过下列三个函
672672

673673
> 我们都知道:**Block不允许修改外部变量的值**,这里所说的外部变量的值,指的是栈中指针的内存地址。`__block` 所起到的作用就是只要观察到该变量被 block 所持有,就将“外部变量”在栈中的内存地址放到了堆中。进而在block内部也可以修改外部变量的值。
674674
675-
**Block不允许修改外部变量的值**Apple这样设计,应该是考虑到了block的特殊性,block也属于“函数”的范畴,变量进入block,实际就是已经改变了作用域。在几个作用域之间进行切换时,如果不加上这样的限制,变量的可维护性将大大降低。又比如我想在block内声明了一个与外部同名的变量,此时是允许呢还是不允许呢?只有加上了这样的限制,这样的情景才能实现。
675+
**Block不允许修改外部变量的值**Apple这样设计,应该是考虑到了block的特殊性,block也属于“函数”的范畴,变量进入block,实际就是已经改变了作用域。在几个作用域之间进行切换时,如果不加上这样的限制,变量的可维护性将大大降低。又比如我想在block内声明了一个与外部同名的变量,此时是允许呢还是不允许呢?只有加上了这样的限制,这样的情景才能实现。于是栈区变成了红灯区,堆区变成了绿灯区
676676

677677
我们可以打印下内存地址来进行验证:
678678

@@ -732,11 +732,11 @@ autoreleasepool 以一个队列数组的形式实现,主要通过下列三个函
732732
![enter image description here](http://i66.tinypic.com/34euhcy.jpg)
733733
734734
735-
这里的a已经由基本数据类型,变成了对象类型。对象类型,block会对对象类型的指针进行copy,copy到堆中,但并不会改变该指针所指向的堆中的地址,所以在上面的示例代码中,block体内修改的实际是a指向的堆中的内容。
735+
这里的a已经由基本数据类型,变成了对象类型。block会对对象类型的指针进行copy,copy到堆中,但并不会改变该指针所指向的堆中的地址,所以在上面的示例代码中,block体内修改的实际是a指向的堆中的内容。
736736
737737
但如果我们尝试像上面图片中的65行那样做,结果会编译不通过,那是因为此时你在修改的就不是堆中的内容,而是栈中的内容。
738738
739-
上文已经说过:**Block不允许修改外部变量的值**,这里所说的外部变量的值,指的是栈中指针的内存地址。
739+
上文已经说过:**Block不允许修改外部变量的值**,这里所说的外部变量的值,指的是栈中指针的内存地址。栈区是红灯区,堆区才是绿灯区。
740740
741741
###39. 使用系统的某些block api(如UIView的block版本写动画时),是否也考虑引用循环问题?
742742

0 commit comments

Comments
 (0)