ObjC中的Block是对闭包的实现,而闭包的主要作用就是实现c语言中的回调函数的特性。说到回调函数的特性,protocol+委托功能不也是对回调函数的一种实现嘛,所以在某些场合Block是能替换protocol+委托功能,但如果要实现的方法比较多还是用protocol+委托的方式来实现吧。
KCButton.h
1 2 3 4 5 6 7 8 9 10 11 12
| #import <Foundation/Foundation.h> @class KCButton; typedef void(^KCButtonClick)(KCButton *);
@interface KCButton : NSObject
@property (nonatomic,copy) KCButtonClick onClick;
-(void)click; @end
|
KCButton.m
1 2 3 4 5 6 7 8 9 10 11 12
| #import "KCButton.h"
@implementation KCButton
-(void)click{ NSLog(@"Invoke KCButton's click method."); if (_onClick) { _onClick(self); } }
@end
|
main.m
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
int main(int argc, const char * argv[]) {
KCButton *button=[[KCButton alloc]init]; button.onClick=^(KCButton *btn){ NSLog(@"Invoke onClick method.The button is:%@.",btn); }; [button click]; /*结果: Invoke KCButton's click method. Invoke onClick method.The button is:<KCButton: 0x1006011f0>. */ return 0; }
|
关于Block总结如下:
1.Block类型定义:返回值类型(^ 变量名)(参数列表)(注意Block也是一种类型);
2.Block的typedef定义:返回值类型(^类型名称)(参数列表);
3.Block的实现:^(参数列表){操作主体};
4.Block中可以读取块外面定义的变量但是不能修改,如果要修改那么这个变量必须声明_block修饰;