Block在OC中是一种数据类型,那么就可以定义变量,作为形参,作为返回值。
复习C语言中指向函数的指针,对于Block学习大有帮助,因为他们很像。
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代表指向的函数没有返回值
// ()代表指向的函数没有形参
// (*roseP)代表roseP是一个指向函数的指针
// void (*roseP) ();
// roseP = printRose;
// roseP();
// 定义一个block变量,
// block和函数一样,可以没有返回值,也没有形参
// 也可以没有返回值有形参
// 也可以有返回值没有形参
// 也可以有返回值有形参
// 所以, 在定义一个block变量的时候, 也需要告诉该变量将来保存的代码有没有返回值和形参
// void代表block将来保存的代码没有返回值
// ()代表block将来保存的代码没有形参
// (^roseBlock) 代表reseBlock是一个block变量, 可以用于保存一段block代码
void (^roseBlock) ();
// 如果block没有参数, 那么^后面的()可以省略
roseBlock = ^(){
printf(" {@} \n");
printf(" | \n");
printf(" \\|/ \n");
printf(" | \n");
};
// 要想执行block保存的代码, 必须调用block才会执行
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));
*/
//基本数据类型可以先定义再初始化,也可以定义的同时再初始化
// int a = 10;
// int b;
// b = 20;
// 因为block是一种数据类型可以先定义再初始化,也可以定义的同时再初始化
// 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;
}
网友评论