前言:
本小节知识点:
1.【了解】什么是Block
2.【理解】block的格式
1.Block的概念:
Block是iOS中一种比较特殊的数据类型
Block是苹果官方特别推荐使用的数据类型, 应用场景比较广泛
动画
多线程
集合遍历
网络请求回调
Block的作用
用来保存某一段代码, 可以在恰当的时间再取出来调用
功能类似于函数和方法
2.Block的格式:
Block的定义格式
返回值类型 (^block变量名)(形参列表) = ^(形参列表) {
};
image.png
block最简单形式
void (^block名)() = ^{代码块;}
例如:
void (^myBlock)() = ^{ NSLog(@"李南江"); };
block带有参数的block的定义和赋值
void (^block名称)(参数列表)
= ^ (参数列表) { // 代码实现; }
例如:
void (^myBlock)(int) = ^(int num){ NSLog(@"num = %i", num); };
带有参数和返回值的block
返回类型 (^block名称)(参数列表)
= ^ (参数列表) { // 代码实现; }
例如:
int (^myBlock)(int, int) = ^(int num1, int num2){ return num1 + num2; };
调用Block保存的代码
block变量名(实参);
3.block和typedef的使用:
由于相同的部分可以抽离出来,所以需要使用typedef:
OC的block的用法
#import <Foundation/Foundation.h>
int main(int argc,onst char * argv[])
{
int (^sumBlock)(int,int);
sumBlock = ^(int value1,int value2){
return value1 + value2;
};
NSLog(@"sum = %i",sumBlock(20,10));
int (^minBlock)(int,int);
minBlock = ^(int value1,int value2){
return value1 - value2;
};
NSLog(@"min = %i",minBlock(20,10));
return 0;
}
使用typedef之后:
#import <Foundation/Foundation.h>
typedef int (^calculteBlock)(int,int);
int main(int argc,onst char * argv[])
{
calculteBlock sumBlock = ^(int value1,int value2){
return value1 + value2;
};
NSLog(@"sum = %i",sumBlock(20,10));
calculteBlock minBlock = ^(int value1,int value2){
return value1 - value2;
};
NSLog(@"min = %i",minBlock(20,10));
return 0;
}
4.block的应用场景:
在学习UI之后就会体会到block的好处。
如果在block中访问了外界的对象,一定要给对象加上__block,只要加上了__block,哪怕block在堆中,也不会对外界的对象进行retain。
加了__block就是地址传递,不加__block是值传递。正因为是值传递,所以可以访问其值,或者return返回其值。