ios开发之 开始使用blocks

来源:互联网 发布:战神笔记本优化 编辑:程序博客网 时间:2024/05/17 22:54

初探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


原创粉丝点击