前言
block是C語言的擴充功能,用一句話來解釋就是:帶有自動變量(局部變量)的匿名函數(shù)全蝶,就是不帶有名稱的函數(shù)创泄。其實block的定義有點像函數(shù)指針沪蓬,很多語言其實都有類似block的概念烈掠。
block語法
block的基本語法形式是:
^
返回值類型
參數(shù)列表
表達式
例如:
^ int (int num) {return num +1;}
^ int (int num1,int num2) {return num1 + num2;}
有時候我們可以省略其中的幾項羞秤,首先是返回值,如果表達式中沒有返回值時向叉,也就是說沒有return
語句的時候返回值類型是可以省略锥腻,例如:
^ (int num) {NSLog(@"數(shù)字:%@",num);}
沒有參數(shù)的時候嗦董,參數(shù)列表也是可以省略的
^ int {return 10*10;}
甚至有時候返回類型和參數(shù)列表都可以省略
^ {NSLog(@"這是一段代碼");}
block類型變量
那如何聲明一個block類型的變量呢
返回值類型
(^變量名)
(參數(shù)類型列表)
例如:
int (^oneBlock) (int);
int (^oneBlock) (int,int);
如何給變量賦值呢
int (^oneBlock) (int) = ^ int (int num) {return num +1;};
而且變量之間也可以互相賦值
int (^oneBlock1) (int) = oneBlock;
自定義block類型
我們可以利用typedef
來定義一個block類型
typedef int (^BlockType)(int);
這樣我們就可以直接使用BlockType
作為類型來聲明變量
BlockType oneBlock;
oneBlock = ^ int (int num) {return num +1;};
將block類型作為函數(shù)參數(shù)
我們也可以將block類型的參數(shù)向函數(shù)中傳遞
- (void)func:(BlockType)block{
NSLog{@"number:%d",block(2)};
}
__block說明符
如果想在block的表達式中母谎,給block語法外聲明的變量賦值,需要在變量前加__block
說明符京革。
__block int num = 0;
void (^oneBlock)(void) = ^{
num = 1;
}
再來看以下代碼
NSMutableArray * array = [[NSMutableArray alloc] init];
void (^oneBlock)(void) = ^{
id obj = [[NSObject alloc] init];
[array addObject:obj];
}
這樣是沒有問題的奇唤,但是以下代碼就有問題了
NSMutableArray * array = [[NSMutableArray alloc] init];
void (^oneBlock)(void) = ^{
array = [[NSMutableArray alloc] init];
}
這樣就出錯了幸斥,這時需要在變量前加__block
,如下
__block NSMutableArray * array = [[NSMutableArray alloc] init];
void (^oneBlock)(void) = ^{
array = [[NSMutableArray alloc] init];
}
版權聲明:出自MajorLMJ技術博客的原創(chuàng)作品 咬扇,轉(zhuǎn)載時必須注明出處及相應鏈接甲葬!