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;