File tree Expand file tree Collapse file tree 1 file changed +3
-3
lines changed Expand file tree Collapse file tree 1 file changed +3
-3
lines changed Original file line number Diff line number Diff 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
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
You can’t perform that action at this time.
0 commit comments