很简单,分两种情况。
第一种情况,该变量没有__block修饰。此时block截获的是block定义处对该变量的一份瞬时拷贝,此后block外的这个变量与block内截获的拷贝相互独立,再没有半毛钱关系。变量值改变不会影响拷贝的值,也就是说block执行时使用的是当时拷贝的值。如果试图在block内对该拷贝进行赋值,编译器会报错。
执行结果:
试图对拷贝的量赋值会报错
第二种情况,该变量有__block修饰。此时block截获的是该变量的真身。block执行时使用的是执行时该变量的值,而不是block定义时该变量的值。可以在block内改变该变量的值,而且是实实在在地改变了该变量的值。
执行结果:
注意一个变量表示的是对象时,该变量的值实际上是指针值。若没有__block修饰,则可以通过该指针值改变其指向的对象,但是不能改变该指针的值。若有__block修饰,则既可改变对象值,也可改变指针值。
block在一个类里面定义时,可以对类的实例变量随意赋值,即便实例变量没有__block修饰,因为block截获的实例变量前省略了self,block捕获的实际是self指针。
另外,block不能截获C语言数组。试图截获数组会报错。数组与指针联系密切,尽量将变量定义为指针,而不要定义为数组。