#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
//返回值类型 (^block变量名)(参数列表) = ^(参数列表){函数体};
//block变量名 = ^(参数列表){函数体};
//===============不同类型的block================
//1.没有返回值没有参数的block
void (^block1)(void) = ^(){
NSLog(@"没有返回值没有参数的block");
};
//block调用的时候才会去执行block存储的代码段
block1();
//2.没有返回值有参数的block
//参数列表:参数类型1 参数名1, 参数类型2 参数名2...
//声明block的时候,参数列表中的参数名可以省略,参数类型不能省略; 给block变量赋值的时候,代码段中的参数列表中,参数名和参数类型都不能省略
void (^block2)(int) = ^(int a){
//a的作用域在block代码块中 (block的参数都是在block代码段中)
NSLog(@"没有返回值有参数的block:%d", a);
};
//有参数的block的调用
block2(10);
//有两个参数的block
void (^block3)(NSString *,NSString *) = ^(NSString * str1, NSString * str2){
NSLog(@"%@ %@", str1, str2);
};
block3(@"hello", @"world");
//3.有返回值的block
BOOL (^block4)() = ^(){
int a = arc4random() % 21;
if (a > 10) {
return YES;
}
return NO;
};
//有返回值的block的调用
BOOL ret = block4();
if (ret) {
NSLog(@"大于10");
}else{
NSLog(@"小于等于10");
}
//============block中外部变量的使用==========
//对于block5来说,变量b是一个外部变量
//__block修饰的变量可以在block代码段中被改变
int b = 100;
__block NSString * str = @"aaa";
void (^block5)() = ^(){
// int c = b;
//在block代码段中可以直接使用外部变量
NSLog(@"%d, %@", b, str);
//外部变量在block中默认是只读的
// b = 200;
str = @"ccc";
};
block5();
b = 200;
block5();
}
return 0;
}