Block是用來封裝和保存代碼,有點像函數(shù),Block可以在任何時候執(zhí)行,效率高。
根據(jù)Block在內(nèi)存中的位置分為三種類型:
1、NSGlobalBlock:全局block,沒有引用外部變量。如:
int a = 10;
void (^block)() = ^{
? ? NSLog(@"block");
};
block();
2、NSStackBlock:棧block,引用外部變量, 當(dāng)函數(shù)返回時block將無效。
int a = 10;
void (^block)() = ^{
? ? NSLog(@"block %@", a);
};
block();
3、NSMallocBlock:堆block,對棧block進行copy,該辦block就會從棧區(qū)復(fù)制到堆區(qū),當(dāng)函數(shù)返回時block依然有效。
block的用法:
1、作為屬性。
比如:在Person類的.h文件定義屬性:
@property (nonatomic, copy) void (^eat)();
使用時:
Person *p = [[Person alloc] init];
p.eat = ^(){
? ? NSLog(@"eat");
}
2、作為方法的參數(shù)(函數(shù)式編程)
比如:在Person類的.h文件定義:
- (void)eat:(void(^)())block;
使用:
Person *p = [[Person alloc] init];
[p eat:^{
? ? NSLog(@"eat");
}];
3、作為方法的返回值(鏈?zhǔn)骄幊蹋?/p>
如:Person類的.h文件定義:
- (Person *(^)(int m))run;
.m文件實現(xiàn)方法:
- (Person *(^)(int m))run {
? ? return ^(int m) {
? ? ? ? NSLog(@"跑了%@米", m);
? ? ? ? return self;
????};
}
使用:
Person *p = [[Person alloc] init];
p.run(200).run(300).run(400);
函數(shù)式編程:訂閱代碼與業(yè)務(wù)邏輯代碼放一起。如AFN框架,網(wǎng)絡(luò)請求的代碼和得到請求結(jié)果的代碼放一起。
響應(yīng)式編程:當(dāng)所有條件滿足時就觸發(fā)。如KVO,代理,通知都是響應(yīng)式編程。
鏈?zhǔn)骄幊蹋汉唵卫斫饩褪峭ㄟ^連續(xù)“.”語法調(diào)用方法,方法返回的對象是方法本身。如Masonry框架。
(RAC,ReactiveCocoa框架,是函數(shù)響應(yīng)式編程。)