Block:語法塊,本質上是匿名函數(沒有名稱的函數)
標准C裡面沒有Block,C語言的後期擴展版本,加入了匿名函數
在C++、JS、Swift等語言有類似語法,叫做閉包
Block語法和C語言裡的函數指針很相似,下面我們先來回顧下C語言中的函數和函數指針
C語言中函數是指:實現某一功能的代碼段
完整的函數包括兩部分:函數聲明、函數定義
函數聲明,即函數原型。例如:int sum (int x,int y);具有兩個整形參數,一個整形返回值的函數
函數定義,即函數實現。例如:int sum(int x,int y){
return x + y;
}
函數指針(變量):存放函數地址(函數名)的指針變量
int(*p)(int x,int )= sum;
函數指針類型:int(*)(int x,int y)即:指向兩個整形參數,一個整形返回值函數的指針
函數指針變量:p
函數指針的值:sum
Block 匿名函數:沒有名稱的函數
例如:int (int x,int y)
因為Block是匿名函數,block變量存放的函數的實現,通過block變量能直接調用函數
Block類型:int (^)(int)
Block變量:myBlock
Block值:^int (int num) {return 7*num;}
即:^返回值類型(參數列表){函數體}其中返回值類型可以省略
例如:寫一個 返回值為整形 參數為OC字符串(僅一個參數)的block,實現將字符串轉換為整形的功能
int (^myBlock)(NSString *) = ^(NSString *string) {
return [string intValue];
};
NSLog(@"%d",myBlock(@"123"));
block的數據類型代表了匿名函數的格式(返回值類型,形參的類型)
block變量的定義與函數指針變量的定義類似,唯一區別於函數指針變量的是變量名前通過脫字符(^)修飾
首先應該用^修飾,剩余的部分與C語言函數定義一致,最大的不同就是沒有函數名(同時返回值類型也可以省略)
block變量在定義時具有變量定義的基本特征,賦值號右側的匿名函數可以當做一個整體被賦值,類似於 int a = 5;
block變量所賦的值是匿名函數。又兼具函數的特征,並且是唯一可以定義在某個函數實現內部(C語言中認為函數是不能嵌套定義的,block是個特例)
Block進行typedef
typedef int (^BlockType)(int x,int y)
原類型:int(^)(int x,int y)
新類型:BlockType
類比函數指針的類型定義,格式與函數指針一致,類型定義一定程度上簡化了block的使用。
typedef int (^SumType)(int,int);
SumType sumBlock = ^(int x,int y) {
return x + y;
};
int result = sumBlock(5,4);
NSLog(@"%d",result);
__block類型標識可以運行局部變量在其後續定義的block內部正常訪問,
__block int num = 0;
void (^testBlock)() = ^() {
for (int i = 0; i < 10; i++) {
count++;
num++;
NSLog(@"%d",count);
}
};
block調用
testBlock();
數組使用Block排序
數組使用Block對兩個字符串進行比較
NSComparisonResult (^compareBlock)(NSString *,NSString *) = ^(NSString *str1,NSString *str2) {
return [str2 compare:str1];
//如果是升序返回-1,如果是降序返回1,如果相等返回0
};
NSLog(@"%ld",compareBlock(@"11",@"12"));
NSArray *array = @[@1,@2,@13,@12,@23];
NSArray *resultArray1 = [array sortedArrayUsingSelector:@selector(compare:)];
NSLog(@"%@",resultArray1);
數組使用Block排序 降序排列
NSComparator sortBlock = ^(id obj1,id obj2) {
return [obj2 compare:obj1];
};
NSArray *resultArray2 = [array sortedArrayUsingComparator:sortBlock];
NSLog(@"%@",resultArray2);
升序序排列
NSArray *resultArray3 = [array sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
return [obj1 compare:obj2];
}];
NSLog(@"%@",resultArray3);
Objective-C中@property的所有屬性詳解 http://www.linuxidc.com/Linux/2014-03/97744.htm
Objective-C 和 Core Foundation 對象相互轉換的內存管理總結 http://www.linuxidc.com/Linux/2014-03/97626.htm
使用 Objective-C 一年後我對它的看法 http://www.linuxidc.com/Linux/2013-12/94309.htm
10個Objective-C基礎面試題,iOS面試必備 http://www.linuxidc.com/Linux/2013-07/87393.htm
Objective-C適用C數學函數 <math.h> http://www.linuxidc.com/Linux/2013-06/86215.htm
好學的 Objective-C 高清PDF http://www.linuxidc.com/Linux/2014-09/106226.htm