博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Block
阅读量:7059 次
发布时间:2019-06-28

本文共 3298 字,大约阅读时间需要 10 分钟。

一、Block的基本定义

Block的基本写法(也是详细写法):

returnType (^blockName)(params) = ^returnType(params) {    // code... };

 

中文再解释:返回类型 (^Block的名字)(Block的参数) = ^返回类型(Block的参数) { 这里放代码 },例:

int (^myBlock)(int num1, int num2) = ^int(int num1, int num2){    return 100;};

 

如果你的Block不需要返回类型和参数,那么你可以简写为:

void (^myBlock2)() = ^(){    };

void (^myBlock2)(void) = ^void(void){    };

返回类型或参数,没有的话可以用“void”代替。

 

你也可以把等于号右边,^后的()删除,即是:

void (^myBlock2)() = ^{    };

这样是不是很简洁?

 

你也可以先定义一个Block函数,但不写函数的实现,我们可以在后面再写具体函数的实现,像这样:

void (^myBlock2)(void);myBlock2 = ^{    };

 

 

二、Block作为方法定义

把Block定义在方法里,与上面不同的是,Block的名字不需要在声明时写上,而是在后面,像这样:

- (void)getWtihBlock:(void (^)())block{    // code...        // 记得要调用block    block();}

 

使用方法:

[self getWtihBlock:^{    NSLog(@"sdf");}];

 

下面作了一个详细点的例子,并写了备注:

/** *  追加自身字符串N次(每次复制前加一个换行\n) * *  @param string      字符串 *  @param count       追加次数 *  @param stringBlock 目标Block,其中str参数为结果字符串 */ // Block也可以定义在方法里,但是不需要定义Block的名字 // IOS开发很多的API也用到了Block,像UIView的块动画- (void)getStrWithString:(NSString *)string               CopyCount:(int)count            resultString:(void (^)(NSString *str))stringBlock{    NSMutableString *newString = [NSMutableString stringWithString:string];    for (NSUInteger i = 0; i < count; i++) {        NSUInteger len = [string length];        NSString *insertString = [NSString stringWithFormat:@"\n%@", string];        [newString insertString:insertString atIndex:len];    }    // 调用block,传入字符串newString    stringBlock(newString);}

 

用法也是一样:

BlockObject *block = [[BlockObject alloc] init];[block getStrWithString:@"Garvey"              CopyCount:3           resultString:^(NSString *str) {               // str为处理后的结果               NSLog(@"str is %@", str);           }];

 

有时候复杂的Block语法会令到函数的声明难以阅读,所以会经常使用typedef对Block起一个新类型。

typedef void (^ResultBlock)(NSString *str);

 

定义方法时就变成了:

- (void)getStrWithString2:(NSString *)string                CopyCount:(int)count             resultString:(ResultBlock)stringBlock;

 

让我们对比一下,使用typedef前后:

// 使用前- (void)getStrWithString:(NSString *)string               CopyCount:(int)count            resultString:(void (^)(NSString *str))stringBlock;// 使用后- (void)getStrWithString2:(NSString *)string                CopyCount:(int)count             resultString:(ResultBlock)stringBlock;

注意:使用方法是一样的,只不过定义变得简单了。

 

 

 Block基础部分

        1.Block的声明

            Block的定义和函数的声明差不多,就是把函数名改成(^blockName)即可。下面是block声明的代码。

            有返回值的

1
int 
(^sumBlock) (
int
int
);

            无返回值的 

1
void 
(^myBlock)(
int
int
);

          2.给block块赋值

 

           给声明好的block,赋值。block的值就是个函数体,给block块赋值有两种方式,一个在声明的时候赋值,一个是先声明在赋值。

            先声明再赋值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//代码块的声明
void 
(^myBlock)(
int
int
);
 
//给代码块赋值
myBlock = ^(
int 
a, 
int 
b)
{
    
//test ++;  //报错
    
NSLog(@
"main_test = %d"
, test);
 
    
//blockVar++不报错;
    
blockVar ++;
    
NSLog(@
"blockVar = %d"
, blockVar);
 
    
int 
sum = a + b;
    
NSLog(@
"a + b = %d"
, sum);
};

            在声明的时候赋值

1
2
3
4
5
int 
(^sumBlock) (
int
int
) = ^(
int 
a, 
int 
b)
{
    
int 
sum = a + b;
    
return 
sum;
};

          3.调用block 

         block的使用和普通函数的使用相同,调用方法如下:

1
2
//调用代码块并接收返回值
int 
sum = sumBlock(20, 30);

         4.把block当做参数传入函数

1
2
3
4
5
6
//把代码块作为函数参数
void 
blockFunction(
int 
(^myBlock)(
int
int
))
{
    
int 
sum = myBlock(10,20);
    
NSLog(@
"fun_sum = %d"
, sum);
}  

        5.在代码块中使用局部变量和全局变量

            在block中可以和对全局变量进行访问和修改,但对局部变量只可以访问,若想修改的话,我们可以在声明局部变量的时候加上关键字__block

            代码如下:

1
__block 
int 
blockVar = 0;

 

转载于:https://www.cnblogs.com/pandas/p/4272181.html

你可能感兴趣的文章
LINQ分页和排序,skip和Take 用法
查看>>
Activiti 查找流程状态(流程下一步)
查看>>
Angular UI Route
查看>>
一个应届毕业生程序员的独白
查看>>
编译安装ZABBIX客户端(代理)
查看>>
jsp下拉框中显示数据库信息&&jsp 下拉框从数据库中如何取值?
查看>>
Linux系统编程 --- 共享内存及内存映射【十全十美】
查看>>
H5页面快速搭建之高级字体应用实践
查看>>
centos6.5、centos6.6修改ssh默认端口号
查看>>
文本文件和二进制文件
查看>>
轻量级smurf源码
查看>>
linux下桌面环境的介绍及VNC的使用
查看>>
深浅拷贝——string
查看>>
主从复制模式下跳过错误
查看>>
剑指offer17
查看>>
samba文件共享
查看>>
WannaCry勒索软件还在继续传播和感染中
查看>>
TarsGo新版本发布,支持protobuf,zipkin和自定义插件
查看>>
Snap up RS3gold 3500M 60% off rs3 for sale &learn
查看>>
oracle函数
查看>>