初探Blocks:Getting
Started with Blocks
翻译不不到位之处,请指正,建议点击上面链接看苹果官网介绍。
下面的部分将以具体的实例帮助你开始使用Blocks
1. 申明和使用Blocks
使用 ^ 操作符声明一个block变量并且指示block的开始,block的函数体包含在一对 {} 中,如下面的例子所示,同C语言一样,最后的 ; 指示声明的结束。
int multiplier = 7;
int (^myBlock)(int) = ^(int num) {
return num * multiplier;
};
下图解释了上面的例子:
注意:block可以利用在定义它所处的作用域内的变量。
如果你声明了一个block,你可以像一个函数一样使用它。
int multiplier = 7;
int (^myBlock)(int) = ^(int num) {
return num * multiplier;
};
printf("%d", myBlock(3));
// prints "21"
2. 直接使用Block
在许多场合,你不需要声明一个block变量,而是只需要写一个内联的block作为参数传递。下面的例子是一个 qsort_b 的函数,它同标准的 qsort_r 函数相同,但是它使用的是 block 变量作为它的最后一个参数。
char *myCharacters[3] = { "TomJohn", "George", "Charles Condomine" };
qsort_b(myCharacters, 3, sizeof(char *), ^(const void *l, const void *r) {
char *left = *(char **)l;
char *right = *(char **)r;
return strncmp(left, right, 1);
});
// myCharacters is now { "Charles Condomine", "George", "TomJohn" }
3. Blocks和Cocoa
Cocoa Frameworks中的许多函数把block作为参数,典型的作用是,对一些对象的集合进行操作,或者当某个操作完成后作为回调处理,下面的例子展示了怎样在NSArray的函数 sortedArrayUsingComparator: 中使用block。该函数只使用了block一个变量,这个例子中block定义为NSComparator的本地变量。
NSArray *stringsArray = [NSArray arrayWithObjects:
@"string 1",
@"String 21",
@"string 12",
@"String 11",
@"String 02", nil];
static NSStringCompareOptions comparisonOptions = NSCaseInsensitiveSearch | NSNumericSearch |
NSWidthInsensitiveSearch | NSForcedOrderingSearch;
NSLocale *currentLocale = [NSLocale currentLocale];
NSComparator finderSortBlock = ^(id string1, id string2) {
NSRange string1Range = NSMakeRange(0, [string1 length]);
return [string1 compare:string2 options:comparisonOptions range:string1Range locale:currentLocale];
};
NSArray *finderSortArray = [stringsArray sortedArrayUsingComparator:finderSortBlock];
NSLog(@"finderSortArray: %@", finderSortArray);
/*
Output:
finderSortArray: (
"string 1",
"String 02",
"String 11",
"string 12",
"String 21"
)
*/
4. __block变量
block的一个强大的特征是它能够改变同一词法作用域内的变量,使用 __block类型修饰符来标识block能够修改的变量。采用上面"Block 和 Cocoa"的例子,如下例所示,你可以使用block变量来记录字符串相同的个数,为了方便展示,下例直接使用了block并且将 currentLocal 作为block中的一个只读变量。这在Blocks和Variables一节有更详细的讨论。
NSArray *stringsArray = [NSArray arrayWithObjects:
@"string 1",
@"String 21", // <-
@"string 12",
@"String 11",
@"Strîng 21", // <-
@"Striñg 21", // <-
@"String 02", nil];
NSLocale *currentLocale = [NSLocale currentLocale];
__block NSUInteger orderedSameCount = 0;
NSArray *diacriticInsensitiveSortArray = [stringsArray sortedArrayUsingComparator:^(id string1, id string2) {
NSRange string1Range = NSMakeRange(0, [string1 length]);
NSComparisonResult comparisonResult = [string1 compare:string2 options:NSDiacriticInsensitiveSearch range:string1Range locale:currentLocale];
if (comparisonResult == NSOrderedSame) {
orderedSameCount++;
}
return comparisonResult;
}];
NSLog(@"diacriticInsensitiveSortArray: %@", diacriticInsensitiveSortArray);
NSLog(@"orderedSameCount: %d", orderedSameCount);
/*
Output:
diacriticInsensitiveSortArray: (
"String 02",
"string 1",
"String 11",
"string 12",
"String 21",
"Str\U00eeng 21",
"Stri\U00f1g 21"
)
orderedSameCount: 2
*/
最后,欢迎大家远离我的微博:http://weibo.com/caryaliu