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;

05-10 22:54