block
// 基本用法一:1.定義無參數(shù)無返回值的Block代碼塊
// void:無返回值 ():無參數(shù)
void (^printBlock)() = ^() {
NSLog(@"這是無參數(shù)無返回值的Block塊");
};
// 調(diào)用該無參數(shù)無返回值的Block塊
printBlock();
// 基本用法二:2.定義有參數(shù)無返回值的Block代碼塊
// (int):數(shù)據(jù)類型? ^(int num):有參數(shù)流济,且數(shù)據(jù)類型也要有
void (^printNumBlock)(int) = ^(int num) {
NSLog(@"這是有參數(shù)無返回值的Block塊, 傳入的參數(shù)是:%d", num);
};
// 調(diào)用該有參數(shù)無返回值的Block塊
printNumBlock(10);
// 基本用法三:3.定義有參數(shù)有返回值的Block代碼塊
// int:有返回值,返回數(shù)據(jù)類型為int的值,??不要加括號
// ^(int num):有參數(shù),且數(shù)據(jù)類型也要有
int (^printCountBlock) (int) = ^(int num) {
NSLog(@"這是有參數(shù)有返回值的Block塊做鹰,傳入的參數(shù)是:%d", num);
return num * 9;
};
// 調(diào)用該有參數(shù)有返回值的Block塊
int consequence = printCountBlock(8);
NSLog(@"這是有參數(shù)有返回值的Block塊,返回的值是:%d", consequence);
為什么用block? 和函數(shù)有很多相似之處并扇,但是絕對絕對不是函數(shù)。
^{
語句體;
};
PS: // myblock是block類型的變量
void (^myblock)() = ^{
NSLog(@"Hello, World!");
};
// 調(diào)用myblock函數(shù)
myblock();
函數(shù)是不允許嵌套定義的抡诞,也就是不允許在函數(shù)的定義里再去定義一個函數(shù)穷蛹。
block可以在函數(shù)的定義里定義。
int(^mathBlock)(int x,int y);? mathBlock 是block類型的變量
typedef? int(^mathBlock)(int x,int y);? 而現(xiàn)在mathBlock類型的別名是.block類型 int(^)(int x,int y);
typedef 的使用
1.int count;? count是整形類型的變量
2.typedef int count;? count是整形類型的別名昼汗。
3.count i; 那么i就是count類型的肴熏,也就是int類型的。
1.int(*math_t)(int, int);
math_t是什么顷窒? 是指向指針類型的變量 蛙吏,存放的是地址。函數(shù)的名字就是函數(shù)的入口地址.
2. typedef int(*math_t)(int, int);
3. math_t mt; mt是什么?變量鸦做。指針類型的變量璧疗。訪問這個變量內(nèi)容里的內(nèi)容的時候,訪問方式是函數(shù)類型馁龟。
PS: // 第二個有參block的使用
// typedef的使用 此時mathBlock類型的別名是.block類型 int(^)(int x,int y);
typedef int(^mathBlock)(int x,int y);
mathBlock mt;
mt = ^(int x, int y){
return x + y;
};
// 調(diào)用有參mathBlock函數(shù)
int result = mt(3, 5);
NSLog(@"result = x+y = %d", result);
block語句塊可以訪問可以訪問block外局部變量,但是只能讀取不能寫崩侠; 如果想寫入,需要在變量聲明的前邊加上__block聲明坷檩。
int var_a = 20;
__block int var_b = 30;
block可以作為返回值類型
在主函數(shù)里: // 第三種
int a = 3; int b = 5;
int result2;
int mta;
TRMath *t = [[TRMath alloc] init];
// 調(diào)用process方法
mta = [t process:^int(int x, int y) {
return x + y;
} withInt:b otherInt:a];
result2 = [t process:^int(int x, int y) {
return x - y;
} withInt:b otherInt:a];
NSLog(@"a + b = %d", mta);
NSLog(@"b - a = %d", result2);
// 第四種
TRPerson *tp = [[TRPerson alloc] init];
// 調(diào)用getBlock方法
TRBlock bloc = [tp getBlock];
bloc();