objC的block是基于c语言开发,可以在c,c++和objc中使用。
声明和使用一个block:
block中会用到一个特殊的操作符^。整个block体都放在{}中。
例如:
1
int multiplier =
7;
2
int (^myBlock)(
int) = ^(
int num) {
3
return num * multiplier;
4 };
借着这张E文的图,我们可以看到定义一个block是多么的简单。
从左到右依次是:myBlock要返回的类型,这里是int。myBlock就是我们block的名字,而^操作符表明此变量是个block。之后则是这个block需要输入的参数的类型。
赋值号后面的是这个block需要的参数,这里是num。大扩号中的是block体,也就是会执行到的代码块。我们看到,最后会返回一个整型值和定义的一样。
定义一个bock就是这么简单。在之后的代码中就可以使用这个block变量,就像使用一个函数一样。看例子:
1
int multiplier =
7;
2
int (^myBlock)(
int) = ^(
int num) {
3
return num * multiplier;
4 };
5
6 printf(
"
%d
", myBlock(
3));
7 // prints "21"
直接使用一个bock:
很多时候就不需要定义block变量了。可以直接使用上例中赋值号右边的block块。我们来看这个例子:
1
char *myCharacters[
3] = {
"
TomJohn
",
"
George
",
"
Charles Condomine
" };
2
3 qsort_b(myCharacters,
3,
sizeof(
char *), ^(
const
void *l,
const
void *r) {
4
char *left = *(
char **)l;
5
char *right = *(
char **)r;
6
return strncmp(left, right,
1);
7 });
8
9 // myCharacters is now { "Charles Condomine", "George", "TomJohn" }
在这里例子中,block块直接当作函数实参的一部分传入了函数中。
在Cocoa中使用到的block:
这里不多说。直接上例子:
1 NSArray *stringsArray = [NSArray arrayWithObjects:
2
@"
string 1
",
3
@"
String 21
",
4
@"
string 12
",
5
@"
String 11
",
6
@"
String 02
", nil];
7
8
static NSStringCompareOptions comparisonOptions = NSCaseInsensitiveSearch | NSNumericSearch |
9 NSWidthInsensitiveSearch | NSForcedOrderingSearch;
10 NSLocale *currentLocale = [NSLocale currentLocale];
11
12 NSComparator finderSortBlock = ^(
id string1,
id string2) {
13
14 NSRange string1Range = NSMakeRange(
0, [string1 length]);
15
return [string1 compare:string2 options:comparisonOptions range:string1Range locale:currentLocale];
16 };
17
18 NSArray *finderSortArray = [stringsArray sortedArrayUsingComparator:finderSortBlock];
19 NSLog(
@"
finderSortArray: %@
", finderSortArray);
20
21
/*
22
Output:
23
finderSortArray: (
24
"string 1",
25
"String 02",
26
"String 11",
27
"string 12",
28
"String 21"
29
)
30 */
__block变量:
block一个牛X的特性就是,block可以修改在同一个lexical scope(直译就是词法范围,好吧,我承认其他译法目前还没发现。等下上例子大家体会吧)中的__block变量。这些变量必须用__block修饰。看清楚block的前面实两道下划线!例子如下:
1 NSArray *stringsArray = [NSArray arrayWithObjects:
2
@"
string 1
",
3
@"
String 21
",
//
<-
4
@"
string 12
",
5
@"
String 11
",
6
@"
Strîng 21
",
//
<-
7
@"
Striñg 21
",
//
<-
8
@"
String 02
", nil];
9
10 NSLocale *currentLocale = [NSLocale currentLocale];
11 __block NSUInteger orderedSameCount =
0;
12
13 NSArray *diacriticInsensitiveSortArray = [stringsArray sortedArrayUsingComparator:^(
id string1,
id string2) {
14
15 NSRange string1Range = NSMakeRange(
0, [string1 length]);
16 NSComparisonResult comparisonResult = [string1 compare:string2 options:NSDiacriticInsensitiveSearch range:string1Range locale:currentLocale];
17
18
if (comparisonResult == NSOrderedSame) {
19 orderedSameCount++;
20 }
21
return comparisonResult;
22 }];
23
24 NSLog(
@"
diacriticInsensitiveSortArray: %@
", diacriticInsensitiveSortArray);
25 NSLog(
@"
orderedSameCount: %d
", orderedSameCount);
26
27
/*
28
Output:
29
30
diacriticInsensitiveSortArray: (
31
"String 02",
32
"string 1",
33
"String 11",
34
"string 12",
35
"String 21",
36
"Str\U00eeng 21",
37
"Stri\U00f1g 21"
38
)
39
orderedSameCount: 2
40 */
大家看到变量orderedSameCount在后面的变量中做了自增操作。