------ android培训、java培训、期待与您交流! ----------
OC基础—block
block:这是OC的一种数据类型(OC的基本数据类型有int char float double BOOL;还有其他的一些数据类型枚举,结构体,指针,id)
block的效率高,使用范围广:是用来保存代码的,类似于函数,但是比函数便捷。
函数:实在代码编译前,就要写好的,而且是不能改变的。
block不一样:
* Block封装了一段代码,可以在任何时候执行
* Block可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或者返回值
* 苹果官方建议尽量多用block。在多线程、异步任务、集合遍历、集合排序、动画转场用的很多
现在我们来看一下:Block可以在程序运行的时候定义一段代码
先看一个无返回值的Block:
int main ()
{
// block用来保存一段代码
// block的标志: ^
/*
block跟函数很像
1. 可以保存代码
2. 有返回值
3. 有形参
*/
// 定义block
// 如果block没有形参^后的()可省略
void(^myblock)() = ^{
NSLog(@"_____________");
NSLog(@"_____________");
};
// 调用block
myblock();
return 0;
}
1. 返回值类型,无返回值就是void。
2. 返回值类型,之后就是一个(),括号里是block名称并且以^开头,^是block的标志。
3. block名称之后就是参数用括号括起来,没有参数就写一个()就行。
在来看一个有返回值有形参的Block
int main()
{
// 带参数有返回值的block
// 很像指向函数的指针
/*
int (*p)(int, int) = sum; // sum就是一个函数
p(10, 11);
*/
int(^sumblock)(int , int) = ^(int a, int b){
return a + b;
};
int c = sumblock(10, 11);
NSLog(@"%d", c);
// 用来输出n条横线
void(^lineBlock)(int i) = ^(int n)
{
for (int i = 0; i < n; i++) {
NSLog(@"_________");
}
};
lineBlock(5);
return 0;
}
!!!记住,定义玩block之后记得加上 ;
typedef定义block类型
我们可以看出,定义一个block非常的麻烦都要写一大堆东西,我们可以用typedef定义block来简化过程。
int(^sumblock)(int , int) = ^(int a, int b){
return a + b;
};
现在:我们用typedef
typedef int(^Myblock)(int, int);
// 调用的时候
Myblock sunblock = ^(int a, int b)
{ return a + b;};
1. block内不是可以访问外面的变量
2. 默认情况下,block内部不能修改外面的局部变量
3. 给局部变量加上__block关键字,这个局部变量就可以在block内部修改
int main()
{
int a = 10;
__block int b = 20;
void (^block)() = ^{
b = 25;
}
block();
return 0;
}
block要掌握的东西
1. 如何定义block
*int (^sumBlock)(int, int);
*void (^myBlock);
2. 如何利用block封装代码
^(int a, int b){
return a - b;
};
^(){
NSLog(@"______");
};
没有参数没有返回值可以写成这样
^{
NSLog(@"______");
};
3. block访问外面变量
* block内部可以访问外面的变量
* 默认情况下,block内部不能修改外面的局部变量
* 给局部变量加上__block关键字,这个局部变量就可以在block内部修改
4. 利用typedef定义block类型
typedef int (^MyBlock)(int, int);
以后就可以里利用MyBlock这种类型来定义block变量
如:
Myblock b1, b2;
b1 = ^(int a, int b)
{
return a + b;
};
b2 = ^(int a, int b)
{
return a - b;
};
或者:
MyBlock b3 = ^(int a, int b)
{
return a * b;
}
------ android培训、java培训、期待与您交流! ----------