当引用到外部的变量
1 无__block关键字时,内部直接创建一个同名变量,然后赋值。所以内部变量的地址 跟外面是不一样的。
2 有__block关键字时,内部创建一个结构体来存储变量。以后使用变量的时候,就相当于修改val->__forwarding->val。
当复制到堆上的时候,也会新建一个新的结构体,并把栈上__forwarding指向到堆上的结构体。所以block复制到堆上后val地址会改变。
参考
当引用到外部的变量
1 无__block关键字时,内部直接创建一个同名变量,然后赋值。所以内部变量的地址 跟外面是不一样的。
2 有__block关键字时,内部创建一个结构体来存储变量。以后使用变量的时候,就相当于修改val->__forwarding->val。
当复制到堆上的时候,也会新建一个新的结构体,并把栈上__forwarding指向到堆上的结构体。所以block复制到堆上后val地址会改变。
参考