- 不要等到明天,明天太遥远,今天就行动。
须读:看完该文章你能做什么?
1.怎么声明一个block,
2.怎么实现一个block,
3.怎么调用一个block.
4.四种block的类型(有无返回值
,有无形参
)
学习前:你必须会什么?(在这里我已经默认你具备C语言的基础了)
什么是函数,什么是指向函数的指针
指向函数的指针分哪几种类型(4种类型
)
一、本章笔记
block是一个数据类型
block的定义格式
返回值类型(^block变量名)(形参列表) = ^ (形参列表){
};
Block的作用
用来保存某一段代码, 可以在恰当的时间再取出来调用
功能 类似 函数 和 方法
如果block没有参数
LyhBlock = ^(){} 中的 ()可以省略
LyhBlock = ^int (){} 中的 ^int 这个返回值一般都是省略
没有返回值,也没有形参
void (^LyhBlock)(); // 声明
LyhBlock = ^(){...实现逻辑};
LyhBlock(); // 调用block
没有返回值,有形参
void (^LyhBlock)(int); // 声明
LyhBlock = ^(int num){...实现逻辑};
LyhBlock(165); // 调用block
有返回值,没有形参
NSString (^LyhBlock)(); // 声明
LyhBlock = ^(int num){...实现逻辑 return @"165"};
LyhBlock(); // 调用block
有返回值,有形参
int (^LyhBlock)(int,int); // 声明
LyhBlock = ^(int v1,int v2){...实现逻辑 return 123};
LyhBlock(3,5); // 调用block
二、code
main.m
#pragma mark 12-Block基本概念
#pragma mark 概念
/*
block是一个数据类型
如果block没有参数
LyhBlock = ^(){} 中的 ()可以省略
LyhBlock = ^int (){} 中的 ^int 这个返回值一般都是省略
没有返回值,也没有形参
void (^LyhBlock)(); // 声明
LyhBlock = ^(){...实现逻辑};
LyhBlock(); // 调用block
没有返回值,有形参
void (^LyhBlock)(int); // 声明
LyhBlock = ^(int num){...实现逻辑};
LyhBlock(165); // 调用block
有返回值,没有形参
NSString (^LyhBlock)(); // 声明
LyhBlock = ^(int num){...实现逻辑 return @"165"};
LyhBlock(); // 调用block
有返回值,有形参
int (^LyhBlock)(int,int); // 声明
LyhBlock = ^(int v1,int v2){...实现逻辑 return 123};
LyhBlock(3,5); // 调用block
*/
#pragma mark - 代码
#import <Foundation/Foundation.h>
#pragma mark 类
#pragma 函数
void printRose(int num)
{
for (int i = 0; i < num; i++) {
printf(" {@} \n");
printf(" | \n");
printf(" \\|/ \n");
printf(" | \n");
}
}
int sum(int v1,int v2)
{
return v1 + v2;
}
#pragma mark - main函数
int main(int argc, const char * argv[])
{
#pragma mark - 一、不带参数的,没有返回值的 函数、指向函数的指针、block
#pragma mark 函数
// printRose();
// printRose();
#pragma mark 回顾指向函数的指针
// void1代表指向的函数 没有返回值
// () 代表指向函数 没有形参
// (*roseP) 代表 roseP 是一个指向函数的指针
// void (*roseP)();
// roseP = printRose;
// roseP();
#pragma mark block
// 定义一个block变量
// block 和 函数一样,
// 可以 没有返回值, 也没有形参
// 也可以 没有返回值,有形参
// 也可以 有返回值,没有形参
// 也可以 有返回值,有形参
// 所以,在定义一个block变量的时候, 也需要告诉变量 将来保存的代码 有没有返回值 和形参
// void 代表block将来保存的代码 没有返回值
// () 代表block将来保存的代码 没有形参
// (^roseBlock) 代表 roseBlock 是一个block变量
// void (^roseBlock)();
// roseBlock = ^(){
// printf(" {@} \n");
// printf(" | \n");
// printf(" \\|/ \n");
// printf(" | \n");
// };
// 要想执行block 保存的代码, 必须调用block才能执行;
// roseBlock();
// roseBlock();
#pragma mark - 二、带参数的,没有返回值 的函数、指向函数的指针、block
#pragma mark 函数
// printRose(1);
#pragma mark 指向函数的指针
// void (*roseP)(int);
// roseP = printRose;
// roseP(3);
#pragma mark block
// void (^roseBlock)(int);
// roseBlock = ^(int num){
// for (int i = 0; i < num; i++) {
// printf(" {@} \n");
// printf(" | \n");
// printf(" \\|/ \n");
// printf(" | \n");
// }
// };
// roseBlock(3);
#pragma mark - 三、带参数 带返回值 的函数、指向函数的指针、block
#pragma mark 指向函数的指针
// int (*sumP)(int,int);
// sumP = sum;
// NSLog(@"sum = %i",sumP(22,33));
#pragma mark block
// int (^sumBlock)(int,int);
// sumBlock = ^(int v1,int v2){
// return v1 + v2;
// };
// NSLog(@"sum = %i",sumBlock(3,55));
#pragma mark - 四、需求
// block是一种数据类型
int (^printfBlock)(int);
printfBlock = ^int (int num){
for (int i = 0; i < num; ++i) {
printf("-----\n");
}
return 1;
};
printfBlock(3);
int a = 10;
int b;
b = 20;
return 0;
}