block在声明的时候,会将block中的所有代码以及用到的变量的值存起来(注意:普通变量则保存变量的值,对象实例则保存指针的地址),所以在不用__block 修饰符时,block内部不会改变普通变量的值,但是会改变实例对象的值(因为指针指向的是同一块内存区域);
加上__block 修饰后,在block内部用的变量不是事先保存的,都是临时获取的,所以block中对变量进行修改,会导致该变量改变。
__weak 的用途:
对象持有block,会给block 进行retain,而block中用到的对象实例,会给给个对象实例都retain,比如block用到 self就会给self进行一次retain,这样self和block间形成了循环引用,所以在block用到self时,需要使用被__weak 修改的self: