一、block的基本
用^操作符来声明一个Block变量,并指明Block述句的开始。Block的主体部分包含在 {}内,像下面的例子中一样(与C语法一样,“;”指明语句的结束):
block概念.png- block最简单形式
定义格式
:void (^block名)() = ^{代码块;}
使用格式
:block名();
/*定义时,把block当成数据类型
特点:1. 类型比函数定义多了一个 ^2. 设置数值,有一个 ^,内容是 {} 括起的一段代码
最简单的定义方式
void (^myBlock)() = ^ { // 代码实现; }/
void (^myBlock)() = ^ {
NSLog(@"hello");};
// 执行时,把block当成函数
myBlock();
//1) 无参无返回值的block
//格式:
// -定义block变量
// 返回值类型 (^block变量名)(形参类型列表);
// -定义block变量并且赋值
// 返回值类型 (^block变量名)(形参列表)=^(形参列表){ //代码块 };
// 形式1: void (^block变量名)() = ^(){};
// 形式2: void (^block变量名)() = ^{}; //省略了小括号
- 例1
1)无参无返回值的block
void (^sbblock)(); //定义变量
void (^sb1)()=^(){
NSLog(@"哈哈,我来了!");
};
void (^sb2)()=^{
NSLog(@"哈哈,我又又有来了来了");
};
// 执行block
//格式: block变量名(实参);
// sbblock(); //如果只定义,就使用,会报错,因为sbblock没有初始化
sb1();
sb2();
2)有参数无返回值的block
形参列表的格式: 数据类型 变量名
void (^myblock1)(int a); // 定义一个无返回值有一个参数的block变量,变量名为myblock1
myblock1 = ^(int a){
NSLog(@"a = %d",a);
}; //分号结束
myblock1(438);
//3)有参数\有返回值的block的使用
// int sum(int a,int b){ return a+b; }
int (^myblock2)(int a,int b)=^(int a,int b){
return a+b;
};
//执行block并且接收block执行的结果
int sum = myblock2(20,34); //返回值
NSLog(@"sum = %d",sum);
2.block的typedef
-
typedef int INT; int 起个别名 INT
-
typedef int ARR[4]; ARR a1; //定义了一个长度为4的整形数组
-
格式:typedef 返回值类型 (^新别名)(参数类型列表);
Typedef int(^MyBlock)(int ,int);
例1)
//给无参无返回值block变量起别名;
//格式: void (^新类型名)();
typedef void (^newType)();
//用新的类型定义block变量
newType t1;
t1 = ^{
NSLog(@"我是使用newType定义出来的变量t1的值");
};
//使用block
t1();
3.block访问外部变量
在block内部可以使用外部变量,但是注意,这是一个新的内存空间变量,以const
拷贝的方式
这样,block可以访问外部变量,但是不可以修改
- 给局部变量加上__block关键字,则这个局部变量可以在block内部进行修改。这样是直接给变量做了一个从
栈区拷贝到堆区的变量
,使用的是堆区的变量
//使用__weak两种
__weak typeof(TWPhotoCollectionViewCell *) weakCell = cell;
__weak HEIMController *selfWeak = self;
网友评论