Block objects are a C-level syntactic and runtime feature. They are similar to standard C functions, but in addition to executable code they may also contain variable bindings to automatic (stack) or managed (heap) memory. A block can therefore maintain a set of state (data) that it can use to impact behavior when executed.
You can use blocks to compose function expressions that can be passed to API, optionally stored, and used by multiple threads. Blocks are particularly useful as a callback because the block carries both the code to be executed on callback and the data needed during that execution.
Block的声明与使用:
Block -- 使用场景1(扯蛋):
项目经理:
狗蛋,把前台MM的照骗美化一下:{要求1:美白,要求2:去黑眼圈,要求3:瘦脸,要求4:凸显身材}
程序员狗蛋:
我是程序员,不干设计师的活,我不会,你行你上,不行别废话
项目经理:
我上就我上,然后不想跟狗蛋说话,并丢给狗蛋一个脚本
程序员狗蛋:
双击脚本,美化完成
项目经理:
狗蛋给我倒杯水{1:过来拿杯子,2:到旁边接水,3:拿回来双手递给我}
程序员狗蛋:
执行倒杯水
block 的一个使用场景,把block当做参数传递,流程简写代码:
程序员:
@interface Developer
- (void)doSomething:(^)()function; //定义
@end
@implementation Developer
- (void)doSomething:(^)()function{ //实现
function();
}
@end
经理:
Developer *goudan = [[Developer alloc] init]; //初始化
[goudan doSomething :^(){ //调用
//do 美白
//do 去黑眼圈
//do 瘦脸.......
}];
[goudan doSomething :^(){ //1:过来拿杯子,2:到旁边接水,3:拿回来双手递给我 }];
简析:block 可以简单的理解为一个函数集,可以当作一个参数/返回值传递
you can use blocks to compose function expressions that can be passed to API
Block -- 使用场景2(扯蛋):
卓越的程序员狗蛋学会了美工的全部技能
项目经理:
狗蛋,把前台MM的照骗美化一下:{要求1:美白,要求2:去黑眼圈,要求3:瘦脸,要求4:凸显身材}
卓越的程序员狗蛋 :
拿到照骗开始美化。。。。。
经理你要美多白?脸要瘦到什么样?.......
项目经理:
少废话,这个往左一点点,哎不对,往右两个像素,哎不对,向下,对向下,这个颜色换成色彩斑斓的黑
10年过后。。。。。
卓越的程序员狗蛋:
经理,我也不知道色彩斑斓的黑是什么样,而且我还有别的任务,等不了你扯那么长时间,我给你个方法,你自己填写参数吧
这种情况程序员的api的写法:
@interface Developer
- ((^)(UIColor *color ))LandscapingPhotos:(UIImage*)image; //定义
@end
@implementation Developer
- ( (^)( UIColor *color ) )LandscapingPhotos:(UIImage*)image{
//执行一系列的美化操作。。。。。。
return ^( UIColor *color ){
if ( color ){
//经理给了我一个色彩斑斓的黑,我直接用这个值就好了
//颜色调整
}
};
}
经理
Developer *SuperGoudan= [[Developer alloc] init]; //初始化
id bfun = [SuperGoudan LandscapingPhotos:照骗];
bfun([UIColor “色彩斑斓的黑”]);//想怎么玩就怎么玩,怎么开心怎么玩
以上为Block 作为返回值的用法。。。
待续。。。