1. block的声明:
声明block变量的语法格式:
返回值类型 (^block变量的名称)(参数列表);
int (^myBlock3)(int num1,int num2);
2. block的初始化
^返回值类型(参数列表){
代码段;
};
3.block的简写
1. 如果我们写的代码段没有返回值.那么代码段的void可以省略.
void (^myBlock1)() = ^(){
NSLog(@"我爱你");
NSLog(@"我恨你");
};
注意,我说的是代码段的返回值如果是void可以省略,声明block变量的返回值无论是什么不可以省略.
2. 如果我们写的代码段没有参数,那么代码段的小括弧写可以省略.
int (^myBlock2)() = ^int{
int num1 = 10 + 20;
return num1;
};
再次强调: 我们说的是代码段.
所以,当1个代码段既没有参数,也没有返回值的适合,就只写^
void (^myBlock1)() = ^{
NSLog(@"我爱你");
NSLog(@"我恨你");
};
3. 声明block变量的时候.如果有指定参数.可以只写参数的类型而不写参数的名称;
int (^myBlock3)(int,int) = ^int(int num1,int num2){
int num3= num1 + num2;
return num3;
};
注意: 这个地方我们说的是声明block变量的时候 再写代码段的时候 类型和名称都要写.
4. 无论代码段是否有返回值.在写代码的时候.可以不写返回值类型 省略.
如果在写代码段的时候,省略了返回值,这个时候系统会自动的确定返回值的类型.
如果代码段中没有返回任何数据 那么它会认为这个代码段是没有返回值的.
如果代码中有返回数据 返回的数据是什么类型 它就会认为这个代码段是什么类型的.
4.关于block访问外部变量的问题
在block代码块的内部可以取定义在外部的变量的值, 定义在外部的局部变量和全局变量.
2. 在block代码块的内部可以修改全局变量的值.但是不能修改定义在外部的局部变量的值.
3. 如果你希望我们定义的局部变量可以允许在block代码的内部去修改,那么就为这个局部变量加1个__block的修饰符.
注意
1. block是1个数据类型.
2. block变量是来存储1段代码的.
3. block变量的声明.
4. block变量的初始化
5. 执行存储在block变量中的代码.
6. 关于4个简写.
7. 使用typedef将复杂的block定义简化.
8. 访问外部变量的问题.
5.关于block循环使用的注意
使用block的时候,如果有循环引用,编译器会提示警告。
如果对象没有持有Block对象,那么不会产生循环引用。如果对象持有了block对象,那么在block引用self的时候这么定义:
__weak typeof(self) weakSelf = self;