block就是OC對閉包函數(shù)的實現(xiàn)蜈亩。block使用很方便,在日常開發(fā)中前翎,合理使用能代碼結(jié)構(gòu)更加清晰稚配。
簡單記錄下block的幾種聲明方法。
- 聲明和調(diào)用
- 作為參數(shù)
- 作為成員變量
- 定義為類型
1. 聲明和調(diào)用
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
//1.帶參數(shù)和返回值
int (^printBlock)(NSString*) = ^(NSString *str){
NSLog(@"%@", str);
return 1;
};
int ret = printBlock(@"it is a block");
//2.無參數(shù)
int (^printBlock1)() = ^() {
return 1;
};
printBlock1();
//3.無參數(shù)無返回值
void (^printBlock2)() = ^() {
NSLog(@"it is a block");
};
printBlock2();
}
以第一個block定義說明:
- block是一個代碼塊港华,因此可以直接定義在函數(shù)中道川。
-
^
符號是block的標(biāo)識 -
int
是返回值,如果沒有返回值寫void
-
printBlock
是block的函數(shù)名 - 第二個括號中
(NSString *)
是block的形參,參數(shù)名可以省略愤惰。如果沒有參數(shù)苇经,則括號里為空 - 等號右邊的部分是block函數(shù)體,如果帶有參數(shù)的話宦言,一定要寫出參數(shù)名
- 最后函數(shù)體結(jié)束后扇单,要在大括號后加上一個
;
- 調(diào)用時要以C語言的形式來調(diào)用。
2. 作為參數(shù)
- (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
中創(chuàng)建blcokTest
蜘澜,并在調(diào)用refresh
方法時去調(diào)用block
4. 定義為類型
可以使用typedef關(guān)鍵字定義block,使使用起來更加簡單响疚。
上面例子中的聲明可以改成如下方式鄙信,這樣這個block的類型就是CompleteBlock
#import <Foundation/Foundation.h>
typedef void (^CompleteBlock)();
@interface blcokTest : NSObject
@property (nonatomic, copy) CompleteBlock block;
-(void)refresh;
@end