block就是OC对闭包函数的实现。block使用很方便,在日常开发中,合理使用能代码结构更加清晰。
简单记录下block的几种声明方法。
- 声明和调用
- 作为参数
- 作为成员变量
- 定义为类型
1. 声明和调用
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
//1.带参数和返回值
int (^printBlock)(NSString*) = ^(NSString *str){
NSLog(@"%@", str);
return 1;
};
int ret = printBlock(@"it is a block");
//2.无参数
int (^printBlock1)() = ^() {
return 1;
};
printBlock1();
//3.无参数无返回值
void (^printBlock2)() = ^() {
NSLog(@"it is a block");
};
printBlock2();
}
以第一个block定义说明:
- block是一个代码块,因此可以直接定义在函数中。
-
^
符号是block的标识 -
int
是返回值,如果没有返回值写void
-
printBlock
是block的函数名 - 第二个括号中
(NSString *)
是block的形参,参数名可以省略。如果没有参数,则括号里为空 - 等号右边的部分是block函数体,如果带有参数的话,一定要写出参数名
- 最后函数体结束后,要在大括号后加上一个
;
- 调用时要以C语言的形式来调用。
2. 作为参数
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[self addNumber:4 withBlock:^(NSInteger number) {
NSLog(@"sum=%ld",number);
}];
}
-(void)addNumber:(NSInteger)number withBlock:(void(^)(NSInteger number))block
{
NSInteger sum = number *2;
block(sum);
}
3. 作为成员变量
//blcokTest.h
#import <Foundation/Foundation.h>
@interface blcokTest : NSObject
@property (nonatomic, copy) void (^completeBlock)();
-(void)refresh;
@end
//blcokTest.m
#import "blcokTest.h"
@implementation blcokTest
-(void)refresh
{
if (self.completeBlock) {
self.completeBlock();
}
}
@end
//ViewController.m
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
blcokTest *test = [[blcokTest alloc]init];
test.completeBlock = ^() {
NSLog(@"test block is completed");
};
[test refresh];
}
在类blcokTest
中声明了一个名为completeBlock
的block。
在viewDidLoad
中创建blcokTest
,并在调用refresh
方法时去调用block
4. 定义为类型
可以使用typedef关键字定义block,使使用起来更加简单。
上面例子中的声明可以改成如下方式,这样这个block的类型就是CompleteBlock
#import <Foundation/Foundation.h>
typedef void (^CompleteBlock)();
@interface blcokTest : NSObject
@property (nonatomic, copy) CompleteBlock block;
-(void)refresh;
@end