block
作用
- block用来保存一段代码
- block标志 ^
- 跟函数很像
- 1.可以保存代码
- 2.有返回值
- 3.有形参
- 4.调用方式一样
- 无返回值无参数
//定义block变量
void (^myblock)() = ^ {
//没有形参可以省略后面的()
NSLog(@"----");
};
//利用block调用block内部的代码
myblock();
- 有返回值有参数
int (^sumblock)(int, int) = ^(int a, int b) {
return a + b;
};
int c = sumblock(10,11);
NSLog(@"%d",c);
block的重定义
- 我们先看一段关于typedef重定义函数指针的
定义一个两数之和的函数
int sum(int a, int b) {
return a + b;
}
定义两个函数指针指向sum
int (*p1)(int, int) = sum;
int (*p2)(int, int) = sum;
因为代码过多重复我们可以typedef重定义一个函数指针类型
typedef int (*SumP)(int, int);
//ps:重定义函数指针 (*SumP)中SumP就是类型名
以后我们就可以这样定义两个函数指针
SumP p3 = sum;
SumP P4 = sum;
block访问外面的变量
block内部可以访问外部变量
int a = 5;
void (^blockA)() = ^() {
NSLog(@"%d",a);
};
blockA();
打印结果为
2016-09-15 14:01:18.552 block[590:22729] 5
默认情况下block内部不能修改外面的局部变量
- 如下这样写会报错
int a = 5;
void (^blockA)() = ^() {
a = 3;
};
- 给局部变量加上__block关键字,这个局部变量就可以block内部修改(如下这样不会报错)
__block int a = 5;
//变量前加上__block修饰符
void (^blockA)() = ^() {
a = 3;
};
blockA();
typedef重定义block类型
- typedef重定义block类型和函数指针很像
typede int (^MyBlock)(int, int); MyBlock 是类型名
MyBlock sumBlock;
//定义一个MyBlock类型的变量
sumBlock = ^(int a, int b) {
return a + b;
};
//给block变量赋值保存的代码
我们定义一个减法类型的
MyBlock minusBlock = ^(int a, int b) {
return a - b;
};
int minus = minusBlock(25,12);
NSLog(@"%d",minus);
//使用MyBlock类型连续定义变量
MyBlock a, b;
总结
1>.如何定义block变量
int (^sumBlock)(int, int);
void (^myBloc)();
2> 如何利用block封装代码
^(int a, int b) {
return a - b;
}
^() {
NSLog(@"--------");
}
^ {
NSLog(@"--------");
//参数为空时()可以省略
}
3> block访问外部变量
- block内部可以访问外部变量
- 默认情况下block内部不能修改外面的局部变量
- 给局部变量加上__block关键字,这个局部变量就可以block内部修改 原因--(将OC代码反编译C++可以看到)block与外部变量默认是值传递,当加上__block修饰之后就会修改成地址传递,这样就可以修改外部变量了
4>利用typeddef定义block类型
typedef int (^MyBlock)(int, int);
MyBlock block; //定义一个MyBlock 类型的变量
MyBlock block1, block2; //连续定义两个MyBlock 类型的变量
block1 = ^(int a, int b) {
return a - b;
};
MyBlock block3 = ^(int a, int b) {
return a + b;
};
网友评论