------
Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
block是跟调用它的主体共享作用域的。也就是说,如果你实现了一个函数(面向对象叫法是方法),并且在该函数里定义了一个block,那么在这个block内部就可以直接访问这个函数的局域变量和参数(我解释一下,如果真把block当做一个函数看,那么这样的作用域是不对的,两个函数两个独立作用域),就像在访问全局函数和变量一样。但是,这种访问的变量是只读的。什么?我要在block里修改这个变量怎么办?那就需要这个变量在声明的时候加上
Blocks,是可以被多次执行封装好了的一段代码功能。再深入点,本质上是方便的匿名函数,可以作为参数传递给一个方法或函数,或者作为结果返回。Blocks自己呢,也可以有参数列表的定义和一个可以被检查出来的或者明确的返回类型声明.我们能用Blocks干什么呢? 可以指派它到一个变量上,就是把一个Blocks赋值给一个变量,这样就可以把这个变量当成函数一样来用了。
Blocks的语法标示符是(^)打头,跟C一样用; 来表示表达式结束)。
上面首先声明了一个变量multiplier
,然后又实现了一个有一个int
型参数和返回值是int
型的myBlock
.
现在就可以把myBlock
当做一个函数来调用了,例如:
int result = myBlock(4); // 返回结果是 28
block是跟调用它的主体共享作用域的。也就是说,如果你实现了一个函数(面向对象叫法是方法),并且在该函数里定义了一个block,那么在这个block内部就可以直接访问这个函数的局域变量和参数(我解释一下,如果真把block当做一个函数看,那么这样的作用域是不对的,两个函数两个独立作用域),就像在访问全局函数和变量一样。但是,这种访问的变量是只读的。什么?我要在block里修改这个变量怎么办?那就需要这个变量在声明的时候加上
__block
修饰符(双下划线),这样这个变量就可以在block里被修改了。还值得说的是,即使一个方法或者函数内的block被当做返回值返回,然后此方法或者函数内的局部作用域被销毁,此方法或者函数内部被block引用的本地变量仍然被当做block对象的一部分被保留,直到block不再引用它们。
如果blocks被作为一个方法或函数的参数使用的话,那么blocks也可以用做这个方法或函数的”回调函数”,当我们在调用这些方法或函数的时候,它们执行自己的代码,而为了请求额外的信息或为了特殊的目的,在合适的时间调用blocks,从而实现”回调函数”的功能。相对于其他函数调用规则(两个函数,两个作用域),block和调用主体共享作用域。