Block(1)

来源:互联网 发布:Linux改变所有文件权限 编辑:程序博客网 时间:2024/04/30 22:24
第一章 Blocks入门 


以下部分使用实际的例子帮助你开始使用 Blocks

1.1 声明和使用一个Block
使用^操作符来来声明一个 block 变量和指示 block 文本的开始。Block 本身的主

的结束):

该示例的解析如下图:

int multiplier = int) = ^(int num){

        

7;

    

    NSLog(@"%d",myBlock(3));

// prints 21;


 

在很多情况下,你不需要声明一个 block 变量;相反你可以简单的写一个内联 (inline)的 ;(73, 73, 73); font-family: Menlo; background-color: rgb(247, 205, 191);">// prints 21;


 

1.2 直接使用Block

在很多情况下,你不需要声明一个 block 变量;相反你可以简单的写一个内联 (inline)的 block 文本,它需要作为一个参数使用。以下的代码使用 qsort_b 函数。 qsort_b 和标准 qsort_r 函数类似,但是它使用 block 作为最后一个参数。

    char *myCharacters[3] = { "TomJohn", "George", "Charles Condomine" };

    qsort_b(myCharacters, 3sizeof(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" }

 

 

1.3 CocoaBlocks

 Cocoa frameworks 里面有部分方法使用 block 作为参数,通常不是执行一个对 象的集合操作,就是在操作完成的时候作为回调使用。下面的例子显示了如何通过 NSArray 的方法sortedArrayUsingComparator:使用 block。该方法使用一个参数,即 block。为了举例说明,该情况下block 被定义为 NSComparator � 21px; color: rgb(0, 0, 0);">:@"stirng 1",@"string21",@"string12",@"string11",@"string02", nil];

    

    ];

    

    static NSStringCompareOptions comparision = NSCaseInsensitiveSearch |NSNumericSearch | NSWidthInsensitiveSearch |NSForcedOrderingSearch;

// NSCaseInsensitiveSearch 忽略大小写

//NSNumericSearch  数字比较

//NSWidthInsensitiveSearch 忽略字符串长度 比较出结果

/NSForcedOrderingSearch  忽略不区分大小写 强制返回比较结果 NSOrderAscending NSOrderDescending

  NSLocale * currentLocale = [NSLocale currentLocale];

//取得当前的位置

    

  NSComparator finderSortBlock = ^(id string1, id string2) {

        

        NSRange string1Range = NSMakeRange(0, [string1 length]);

        

        return [string1 compare:string2 options:comparision range:string1Rangelocale:currentLocale];

    };

    

    NSArray * finderSortArray = [stringsArray sortedArrayUsingComparator:finderSortBlock];

    NSLog(@"finderSortArray: %@", finderSortArray); 


1.4 __block变量

Blocks 的最大一个特色就是可以修改相同作用域的变量。你可以使用__block 存 储类型修饰符来给出信号要修改一个变量。改编“Cocoa  Blocks”所示的例子,你 可以使用一个 block 来计数多少个字符串和 block 中只读变量 currentLocal 相同:

 NSArray * stringsArray = [NSArray arrayWithObjects:@"stirng 1",@"string21",@"string12",@"string21",@"string21",@"string11",@"string02", nil];

    

    static NSStringCompareOptions comparision = NSCaseInsensitiveSearch |NSNumericSearch | NSWidthInsensitiveSearch |NSForcedOrderingSearch;

    

    NSLocale * currentLocale = [NSLocale currentLocale];

    

    __block NSUInteger orderedSameCount = 0;

    

    NSArray * finderSortArray = [stringsArray sortedArrayUsingComparator:^(idstring1, id string2) {

        

        NSRange string1Range = NSMakeRange(0, [string1 length]);

        NSComparisonResult comparisonResult = [string1 compare:string2options:comparision range:string1Range locale:currentLocale];

        if (comparisonResult == NSOrderedSame) {

            orderedSameCount ++;

        }

        return comparisonResult;

        

    }];

    NSLog(@"finderSortArray: %@", finderSortArray);

    NSLog(@"orderedSameCount~%d",orderedSameCount);



 第二章 概念概述

Block 对象提供了一个使用 C 语言和 C 派生语言(如 Objective-C  C++)来创建 表达式作为一个特别(ad hoc)的函数。在其他语言和环境中,一个block对象有时候 被成为“闭包(closure)”。在这里,它们通常被口语化为”块(blocks)”,除非在某 些范围它们容易和标准 C 表达式的块代码混淆。 

2.1 Block功能

一个 block 就是一个匿名的内联代码集合体:

  •  和函数一样拥有参数类型

  •  有推断和声明的返回类型

  •  可以捕获它的声明所在相同作用域的状态

    可以和其他定义在相同作用域范围的 blocks 进行共享更改

  •  在相同作用域范围(栈帧)被销毁后持续共享和更改相同作用域范围(栈帧)的状

    你可以拷贝一个 block,甚至可以把它作为可执行路径传递给其他线程(或者在自 己的线程内传递给run loop)。编译器和运行时会在整个block生命周期里面为所有 block 引用变量保留一个副本。尽管 blocks 在纯 C 和 C++上面可用,但是一个 block 也同样是一个 Objective-C 的对象。

    2.2 用处

    Blocks 通常代表一个很小、自包的代码片段。因此它们作为封装的工作单元在并 发执行,或在一个集合项上,或当其他操作完成时的回调的时候非常实用。

    Blocks 作为传统回调函数的一个实用的替代办法,有以下两个原因:

    1. 它们可以让你在调用的地方编写代码实现后面将要执行的操作。

      因此 Blocks 通常作为框架方法的参数。

    2. 它们允许你访问局部变量。

      而不是需要使用一个你想要执行操作时集成所有上下文的信息的数据结构来 进行回调,你可以直接简单的访问局部变量。 
0 0
原创粉丝点击