Block這渣渣,對于剛寫IOS的人,肯定都是有很多疑惑的,我們先來說明Block的語法及用例。
block聲明定義.jpeg
1.定義一個Block
int num1 = 2;
定義一個名為myBlock,返回值為int參數為空的 block
int (^myBlock)(void) = ^(void) {
return 10;
};
myBlock();
int (^myBlock1)(int) = ^(int num){
return num * 10;
};
myBlock1(num1);
void (^myBlock2)(int,int) = ^(int num1,int num2){
NSLog(@"num1 is : %d num2 is : %d ",num1,num2);
};
myBlock2(num1,100);
2.把block當做參數
blockMethod.png
blockMethod-1.png
-(void) addPullToRefreshBlock:(void(^)(void))block {
_cardTableView.mj_header = [MyMJHeader headerWithRefreshingBlock:^{
block();
}];
}
3.把block當做返回值
- (void (^)(void)) method;
4.typedef block
typedef void (^BoolBlock)(BOOL);//一個只接受一個BOOL參數,沒有返回值的block
typedef int (^IntBlock)(void);//一個沒有參數,返回int的block
typedef BoolBlock (^HugeBlock)(IntBlock);//看看,這個HugeBlock的參數和返回值都是block
同樣,利用typedef后的 block 類型,就可以簡化上面各種寫法
例如:
block參數
-(void) addPullToRefreshBlock:RefreshBlock block{
//code
}
返回block
-(BoolBlock) method;
5.類的成員變量
利用上面的 typedef后的類型
@property (copy,nonatomic) BoolBlock myBlock;
6.全局block
static int(^maxIntBlock)(int, int) = ^(int a, int b){return a>b?a:b;};
int main()
{
printf("%d\n", maxIntBlock(2,10));
return 0;
}
7.__block
如果要在block內修改block外聲明的棧變量,那么一定要對該變量加__block標記
int main()
{
__block int i = 1024;
BoolBlock bBlock = ^(BOOL bV) {
if (bV) {
i++;//如果沒有__block標記,是無法通過編譯的。
}
};
}