https://code.google.com/p/nevel-mercury/wiki/GetFamiliarWithBlock#block和变量之间的关系
1.Block 外部变量使用
在block体中可以访问到block以外的变量,分两种情况考虑:
(1)在block体中访问外部基本类型变量
此时该基本类型会被 block 进行一次 copy 后以一个临时变量存放在 block 体中。 毫无疑问,既然是copy一份,那在block体内修改该基本变量对外部的基本变量是没有影响的;同理block体外修改此变量对体内的变量也是没有影响的。事实上,编译器不允许在block体直接修改外部变量。
(2)在block体中访问外部指针变量 或 objective-c中所有对象
此时该指针变量会被block进行retain操作后也以一个临时变量存放起来。因为会 retain 操作,很容易会形成引用环而不能释放,尤其block回调时。
为了摆脱外部变量魔咒,可以用 __block 修饰外部变量(注意是两个下划线),当外部变量被 __block 修饰后,block体不再会对外部变量进行 retain 或 copy 操作了。这样就如同一般的语句体,保证内外变量的一致了。