Block使用总结:
1、格式: ReturnType (^ BlockName)(参数…);
//例: int (^ BFunc) (int a, int b);
2、block赋值:
block名 =^(){};
3、定义
3.1 先定义后赋值
int (^ myBlock4)(int a,int b) = NULL; // 有返回值myBlock4 = ^(int a ,int b){ return a+b;};
3.2 block的定义:
//例(1)int (^block_func1)(int,int) = ^(int a,int b){ return a+b;};//例(2)void (^block_func2)(int)=^(int a){ NSLog(@"%i",a);};//例 (3)NSString *(^block_func3)(void)=^(){ return @"测试无参有返回值的block";};
3.2
(1)使用typedef 给block取别名
typedef int(^MyBlock)(int a,int b);//使用时MyBlock = ^(int a,int b) { return a+b; };
(2)若想再在"block内"使用"block外"定义的变量,需要使用 __block 修饰
__block int sum = 0;MyBlock myblock3 = ^(int a,int b) { sum = a+b; return 10;};int c = myblock3(2,2);NSLog(@"sum = %i,c = %i", sum, c);
4、block做属性
typedef void (^ReturnSelectedCityName)(NSString * name);@interface LXBAddCityVC : UIViewController@property(nonatomic,strong)ReturnSelectedCityName selectedCityName;//arc下使用strong,编译器会自动将其复制到堆上;MRC下使用copy,将其复制到堆上@end //使用时: LXBAddCityVC *addVC = [[LXBAddCityVC alloc]init];
addVC.selectedCityName = ^(NSString *name){ //block代码 };
5、block与代理
区别:使用block,不需要定义代理,也可以完成传值,且是"一对多"。
使用代理,需要遵守协议,然后实现代理中的一些方法,代理是"一对一"的。
例如:@property(nonatomic,weak)id<Delegate> delegate; //代理
@property(nonatomic,strong)Myblock mybock;