Blocks块编程指南

简介

块对象是C语言级别的语法和运行特性。类似于标准C函数。除了可执行代码之外他们还可以把变量绑定到堆(heap)栈(stack)中去。因此块能维持一系列的状态(data),这些状态或数据会影响执行后的结果。
你可以在API传递、多线程中使用块函数表达式。最有用的是把块作为回调函数,因为在回调时可以携带代码和参数。在OS X10.6的Xcode开发工具上可以使用块,它使用GCC个Clang集成,你可以在OS X10.6以后或者IOS4.0以后的版本使用块,块运行时(block runtime)是开源的,可以在LLVM’s compiler-rt subproject repository中找到。块之前在C标准工作组( N1370: Apple’s Extensions to C)中提到过。由于Objective-c和c++都由C衍生而来,所以块都可以在这三种语言中使用。
你应该通过阅读这篇文档来学习如何在C、C++、objective-c中使用块。

文档组成

这篇文档包括以下章节:


开始使用块

下面的部分将使用实例带你开始学习块

声明、使用块

我们使用 ^ 操作符去声明一个块变量的开始。块主体使用{}(本例使用C语言,结尾使用;)

int multiplier = 7;

int (^myBlock)(int) = ^(int num) {

return num * multiplier;

};

下图解释此例。

blocks.jpg

注意,块可以使用同一作用域内定义的变量
如果你声明了一个块变量,你可以把它当做函数来使用:

int multiple = 7;
int (^myBlock)(int) = ^(int num){
    return num * multiple;
};

printf("%d", myBlock(3));
//prints "21"

直接使用块

很多时候,我们并不需要直接声明一个块变量,你只需要提供一个内联块来作为参数,下例中使用了函数 qsort_b,qsort_b函数和标准函数qsort_r相类似,但是它提供了一个块来作为参数。

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, l);
});

//myCharacters is now { "Charles Consuming", "George", "TomJohn" }

Cocoa和块

Cocoa frameworks有一些方法中使用块作用参数,典型的用在集合中执行操作,或者用于操作完成后的回调,下例展示了如何在NSArray的方法sortedArrayUsingComparator中使用块,这个方法只有一个块参数,这样块就变成NSComparator的局部变量了。

NSArray *stringArray = @[ @"string 1",
                          @"string 21",
                          @"string 12",
                          @"string 11",
                          @"string 02" ];
static NSStringCompareOptions comparisonOptions = NSCaseInsensitiveSearch | NSNumericSearch | NSWidthInsensitiveSearch | NSForceOrderingSearch;
NSLocale *currentLocale = [NSLocal 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",
)
*/

block变量

块的一个强大特性是可以改变同一作用域内的变量,如果你声明一个变量时使用block,你就可以在块的作用域内改变它的值,下例中你可以使用block的变量来计算有多少个字符串值相同,在块中使用currentLocale作为只读变量。

NSArray *stringsArray = @[ @"string 1",
                          @"string 21", // <-
                          @"string 12",
                          @"string 11",
                          @"string 21", // <-
                          @"string 21", // <-
                          @"string 02" ];
NSLocale *currentLocale = [NSLocal 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:NSDiacriticInsenstiveSearch range:string1Range locale:currentLocale];

if (comparisonResult == NSOrderSame) {
    orderSameCount++;
}
return comparisonResult;
}];
NSLog(@"diacriticInsensitiveSortArray: %@", diacriticInsensitiveSortArray);
NSLog(@"orderedSameCount: %d", orderedSameCount);

/*
Output:
finderSortArray: (
    "string 1",
    "string 02",
    "string 11",
    "string 12",
    "string 21",
    "str\U00eeng 21",
    "stri\U00f1g 21"
)
orderSameCount: 2
*/

更多细节请看以下章节 声明和创建块
等待继续更新…

时间: 2024-12-21 23:03:39

Blocks块编程指南的相关文章

《Spark 官方文档》Spark编程指南

Spark编程指南 概述 总体上来说,每个Spark应用都包含一个驱动器(driver)程序,驱动器运行用户的main函数,并在集群上执行各种并行操作. Spark最重要的一个抽象概念就是弹性分布式数据集(resilient distributed dataset – RDD),RDD是一个可分区的元素集合,其包含的元素可以分布在集群各个节点上,并且可以执行一些分布式并行操作.RDD通常是通过,HDFS(或者其他Hadoop支持的文件系统)上的文件,或者驱动器中的Scala集合对象,来创建或转换

iOS 地址簿编程指南(Address Book Programming Guide for iOS)

iOS 地址簿编程指南(Address Book Programming Guide for iOS) 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. 概述(Introduction) iOS

Python函数式编程指南(四):生成器详解

  这篇文章主要介绍了Python函数式编程指南(四):生成器详解,本文讲解了生成器简介.生成器函数.生成器函数的FAQ等内容,需要的朋友可以参考下 4. 生成器(generator) 4.1. 生成器简介 首先请确信,生成器就是一种迭代器.生成器拥有next方法并且行为与迭代器完全相同,这意味着生成器也可以用于Python的for循环中.另外,对于生成器的特殊语法支持使得编写一个生成器比自定义一个常规的迭代器要简单不少,所以生成器也是最常用到的特性之一. 从Python 2.5开始,[PEP

高质量C++/C编程指南

              高质量C++/C编程指南         文件状态 [ ] 草稿文件 [√] 正式文件 [ ] 更改正式文件 文件标识:   当前版本: 1.0 作    者: 林锐 博士 完成日期: 2001年7月24日     版本历史   版本/状态 作者 参与者 起止日期 备注 V 0.9 草稿文件 林锐     2001-7-1至 2001-7-18 林锐起草 V 1.0 正式文件 林锐     2001-7-18至 2001-7-24 朱洪海审查V 0.9, 林锐修正草稿

Spark编程指南笔记

本文是参考Spark官方编程指南(Spark 版本为1.2)整理出来的学习笔记,主要是用于加深对 Spark 的理解,并记录一些知识点. 1. Spark介绍 Spark是UC Berkeley AMP lab所开源的类Hadoop MapReduce 框架,都是基于map reduce算法所实现的分布式计算框架,拥有Hadoop MapReduce所具有的优点:不同于MapReduce的是Job中间输出和结果可以保存在内存中,而不需要读写HDFS,因此Spark能更好地适用于machine l

[iOS]日历和提醒编程指南(Calendar and Reminders Programming Guide)

[iOS]日历和提醒编程指南(Calendar and Reminders Programming Guide) 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. 分析:事件提醒开发包(Event

《Spark官方文档》Spark Streaming编程指南(二)

累加器和广播变量 首先需要注意的是,累加器(Accumulators)和广播变量(Broadcast variables)是无法从Spark Streaming的检查点中恢复回来的.所以如果你开启了检查点功能,并同时在使用累加器和广播变量,那么你最好是使用懒惰实例化的单例模式,因为这样累加器和广播变量才能在驱动器(driver)故障恢复后重新实例化.代码示例如下: Scala Java Python object WordBlacklist { @volatile private var ins

《Pig编程指南》一1.1 Pig是什么?

第1章 初识Pig Pig编程指南 1.1 Pig是什么? Pig提供了一个基于Hadoop的并行地执行数据流处理的引擎.它包含了一种脚本语言,称为Pig Latin,用来描述这些数据流.Pig Latin本身提供了许多传统的数据操作(如join.sort.filter等),同时允许用户自己开发一些自定义函数用来读取.处理和写数据. Pig是一个Apache开源项目.这意味着用户可以免费下载源码或者二进制包,自由使用它,对这个项目贡献自己的代码,同时也可以在Apache License的许可范围

类型参数的约束(C# 编程指南)

类型参数的约束(C# 编程指南) Visual Studio 2005 其他版本 38(共 55)对本文的评价是有帮助 - 评价此主题 在定义泛型类时,可以对客户端代码能够在实例化类时用于类型参数的类型种类施加限制.如果客户端代码尝试使用某个约束所不允许的类型来实例化类,则会产生编译时错误.这些限制称为约束.约束是使用 where 上下文关键字指定的.下表列出了六种类型的约束: 约束 说明 T:结构 类型参数必须是值类型.可以指定除 Nullable 以外的任何值类型.有关更多信息,请参见使用可