#import <Foundation/Foundation.h>dom
int main(int argc, const char * argv[]) {函數
@autoreleasepool {spa
//返回值類型 (^block變量名)(參數列表) = ^(參數列表){函數體};.net
//block變量名 = ^(參數列表){函數體};orm
//===============不一樣類型的block================作用域
//1.沒有返回值沒有參數的blockget
void (^block1)(void) = ^(){it
NSLog(@"沒有返回值沒有參數的block");io
};class
//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;
}