Skip to content

Commit

Permalink
修改38题,为加深对__block原理的理解,添加描述:栈区是红灯区。
Browse files Browse the repository at this point in the history
  • Loading branch information
ChenYilong committed May 23, 2016
1 parent f5f989c commit 124126f
Showing 1 changed file with 3 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -672,7 +672,7 @@ autoreleasepool 以一个队列数组的形式实现,主要通过下列三个函

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

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

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

0 comments on commit 124126f

Please sign in to comment.