Block
Block
目录
- 概述——对Block的理解
- Block的操作
创建Block
使用Block
- Block的用途
界面传值
block作为函数参数
- Delegate、Block和Notification的区别与联系
概述——对Block的理解
Block代码块,有时候我们可以把功能代码块的封装放到block里面,然后通过使用block来实现某些功能,除此之外,block还有很多其他强大的功能
Block的操作
创建Block
返回类型 (^block名)(参数列表) = ^(参数列表){ };
例如
void (^myblock)( ) = ^( ){ };
int (^myblock)( int,int) = ^(int a,int b){对a、b的处理;return 返回值;};
使用Block
需要带上“( )”,例如:myblock( );myblock(10,20);
block里面改变外部的局部变量
- block内部可以访问外部变量
- 默认情况下,block内部不能修改外部的局部变量
- 给局部变量加上__block关键字,则这个局部变量可以在block内部进行修改
使用typedef定义block类型(和指向函数的指针很像),感觉有点像面向对象编程中松耦合和多态的思想,例如:
typedef int (^myblock3)(int,int);
myblock3 block0,block1;
block0 = ^(int a,int b){return a-b;};
block1 = ^(int a,int b){return a+b;};
Block的用途
界面传值
在SecondViewController.h中定义一个block,并用该block给SecondViewContrller声明一个block对象
typedef void (^PassValueBlock)(NSString *);
@property (nonatomic,copy) PassValueBlock passValueBlock;
当SecondViewController消失时,调回到第一个界面所做处理
if(_passValueBlock !=nil &&![_textField.text isEqualToString:@""]){
_passValueBlock(_textField.text);
}
在FirstViewController中,跳转前所做处理
PassValueBlock block = ^(NSString *str){
_showLabel.text = str;
};
secondVC.passValueBlock = block;
block作为函数参数
函数定义
-(void)compareA:(int)numA andB:(int)numB withBigger:(void (^)(int p))big andSmaller:(void (^)(int p))small{
if(numA>numB){
big(numA+numB);
}else{
small(numA-numB);
}
}
函数调用
[myClass compareA:10 andB:20 withBigger:^(int p){
//block对函数定义里所生成的p做的处理
}andSmaller:^(int p){
//block对函数定义里所生成的p做的处理
}];
Delegate、Block和Notification的区别与联系
区别
1. Most delegate protocols have a handful of messages.
we can say that “If an object has more than one distinct event, use delegation.”
2. An object can only have one delegate.