iOS - block基本使用方法

来源:互联网 发布:c语言else if 格式 编辑:程序博客网 时间:2024/05/16 06:45

我们可以把Block当作一个闭包函数,它可以访问外部变量和局部变量,但默认是不可以修改外部变量。

你可以使用它来做回调方法,比起使用代理(Delegate)会更加直观。

一、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;
复制代码

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

1 0
原创粉丝点击