标签:
Block,称为代码块,它是一个C级别的语法以及运行时的一个特性,和标准C中的函数(函数指针)类似,但是其运行需要编译器和运行时支持,从ios4.0开始就很好的支持Block。
Block很像匿名方法,但实际上它是一种类型,它是用来封装保存代码的,只要用block封装的代码,可以在任何时候执行。Block效率很高,不仅可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值。
苹果官方建议尽量多用block。在多线程、异步任务、集合遍历、集合排序、动画转场用的很多。
一、Block定义
返回值 (^ 块名)(参数1,参数2…);
代码
//无参无返回值的block void (^MyBlocks1)(); //参数为整型的block void (^MyBlocks2)(int); //参数为NSString的block void (^MyBlocks3)(NSString *); //多个参数,有返回值的block BOOL (^MyBlocks4)(int, int);
二、Block实现
^(参数1,参数2…){操作主体};
代码
MyBlocks1 = ^{ NSLog(@" MyBlocks1"); }; MyBlocks2 = ^(int num){ NSLog(@" MyBlocks2,参数为%i",num); }; MyBlocks3 = ^(NSString *str){ NSLog(@" MyBlocks3,参数为%@",str); }; MyBlocks4 = ^(int num1, int num2){ NSLog(@" MyBlocks4"); if (num1>num2) return YES; else return NO; };
三、声明的同时实现
代码
int (^myBlocks5)(int, int) = ^(int num1, int num2){ return num1>num2?num1:num2; };
四、代码块中的全局变量和局部变量
在块中可以使用全局变量也可以使用局部变量,但是在块外面声明的实例变量默认情况下,在块中只能使用,但是不能修改。如果想修改,需要在变量前面添加__block
代码
int num1 = 10; __block int num2 = 10; void (^myBlocks6)() = ^(){ NSLog(@"num1=%i, num2=%i",num1,num2); //num1 += 10; //错误!!! num2 += 10; };
五、Block的调用
块名(实参1,实参2…);
代码
int number = myBlocks5(10, 20); myBlocks6();
六、Block作为参数
代码
//方法的声明 + (void)dowmloadImg:(NSString *)url success:(void(^)(NSString *pic))success failure:(void(^)(NSString *error))failure; //方法的实现 + (void)dowmloadImg:(NSString *)url success:(void (^)(NSString *pic))success failure:(void (^)(NSString *error))failure { BOOL flag = NO; if (flag) { success([NSString stringWithFormat:@"这是一张图片%@", url]); } else { failure(@"下载失败"); } } //方法的调用 [Test dowmloadImg:@"http://www.jerehedu.com/images/temp/logo.gif" success:^(NSString *pic) { NSLog(@"%@", pic); } failure:^(NSString *error) { NSLog(@"%@", error); }];
标签:
原文地址:http://www.cnblogs.com/jerehedu/p/4891029.html