Block在OC中是一種數(shù)據(jù)類型寂拆,那么就可以定義變量,作為形參抓韩,作為返回值纠永。
復(fù)習(xí)C語言中指向函數(shù)的指針,對于Block學(xué)習(xí)大有幫助谒拴,因?yàn)樗麄兒芟瘛?/p>
main.m
#import <Foundation/Foundation.h>
void printRose(int num)
{
for (int i = 0; i < num; ++i) {
printf(" {@} \n");
printf(" | \n");
printf(" \\|/ \n");
printf(" | \n");
}
}
int sum(int value1, int value2)
{
return value1 + value2;
}
int main(int argc, const char * argv[]) {
/*
第一個例子:沒有返回值,也沒有形參
// void代表指向的函數(shù)沒有返回值
// ()代表指向的函數(shù)沒有形參
// (*roseP)代表roseP是一個指向函數(shù)的指針
// void (*roseP) ();
// roseP = printRose;
// roseP();
// 定義一個block變量,
// block和函數(shù)一樣,可以沒有返回值,也沒有形參
// 也可以沒有返回值有形參
// 也可以有返回值沒有形參
// 也可以有返回值有形參
// 所以, 在定義一個block變量的時候, 也需要告訴該變量將來保存的代碼有沒有返回值和形參
// void代表block將來保存的代碼沒有返回值
// ()代表block將來保存的代碼沒有形參
// (^roseBlock) 代表reseBlock是一個block變量, 可以用于保存一段block代碼
void (^roseBlock) ();
// 如果block沒有參數(shù), 那么^后面的()可以省略
roseBlock = ^(){
printf(" {@} \n");
printf(" | \n");
printf(" \\|/ \n");
printf(" | \n");
};
// 要想執(zhí)行block保存的代碼, 必須調(diào)用block才會執(zhí)行
roseBlock();
roseBlock();
*/
/*
第二個例子:沒有返回值,有形參
// printRose(10);
// void (*roseP)(int);
// roseP = printRose;
// roseP(3);
void (^roseBlock) (int);
roseBlock = ^(int num){
for (int i = 0; i < num; ++i) {
printf(" {@} \n");
printf(" | \n");
printf(" \\|/ \n");
printf(" | \n");
}
};
roseBlock(2);
*/
/*
第三個例子:有返回值,有形參
// int (*sumP)(int, int);
// sumP = sum;
// NSLog(@"sum = %i", sumP(10 , 20));
int (^sumBlock) (int, int);
sumBlock =^(int value1, int value2){
return value1 + value2;
};
NSLog(@"sum = %i", sumBlock(10, 40));
*/
//基本數(shù)據(jù)類型可以先定義再初始化尝江,也可以定義的同時再初始化
// int a = 10;
// int b;
// b = 20;
// 因?yàn)閎lock是一種數(shù)據(jù)類型可以先定義再初始化,也可以定義的同時再初始化
// int (^printBlock)(int);
// printBlock = ^int (int num){
// for (int i=0; i<num; ++i) {
// printf("--------\n");
// }
// return 1;
// }
int (^printBlock)(int)= ^int (int num){
for (int i=0; i<num; ++i) {
printf("--------\n");
}
return 1;
}
printBlock(2);
return 0;
}