Block(代码段):
Block封装了一段代码,可以再任何时候执行
Block可以作为函数参数或者函数返回值
定义block方法一:
#import "Button.h"
void test(){
//^ 是block的标志 ,定义一个block返回值int类型,接受两个int类型的参数
int (^Sum) (int,int) = ^(int a, int b){
return a+b;
}
int a = Sum(10,11);
NSLog(@"%i", a);
}
int main(int argc , const char * argv[] ){
@autoreleasepool{
test();
}
}
定义block 方法二:
#import "Button.h"
typedef int (^MySum)(int, int );
void test2(){
__block int c = 15; //两个下划线
int t=20
//声明一个block 变量
MySum sum = ^(int a, int b){
NSLog(@"%i", t); //可以访问外面的变量,但是不能改变值
c = 25; //如果外部变量用了__block 关键字,就可以在block内部修改这个变量
return a+b;
};
NSLog(@"%i", sum(10,15));
}
int main(int argc , const char * argv[] ){
@autoreleasepool{
test2();
}
}
利用block实现监听器思想:
.m文件
#import "Button.h"
@implementation Button
-(void)click{
_block(self);
}
@end
.h文件
#import <Foundation/Foundation.h>
@class Button;
typedef void (^ButtonBlock) (Button * btn);
@interface Button : NSObject
@property (nonatomic, assign) ButtonBlock block;
-(void) click;
@end
main方法中运行
#import <Foundation/Foundation.h>
#import "Button.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
Button * btn = [[[Button alloc] init] autorelease];
btn.block = ^(Button * btn){
NSLog(@"button %@ is clicked",btn);
};
[btn click];
}
return 0;
}