《企业级ios应用开发实战》一3.5 块编程

3.5 块编程

C语言的运行时特性中包括了块,标准C工作组的 N1370: Apple’s Extensions to C 中(其中也包括垃圾回收)对块进行了定义。作为C语言的扩展,Objective-C在OSX 10.6及iOS 4.0以后支持块语法。块运行时也会被集成到LLVM的compiler-rt子项目存储库中。

3.5.1 块的特点

一些面向对象的动态语言如ruby、groovy,都提供了对块的支持(在groovy中,块被称作为闭包“closure”)。块是用一对{}括号括起来的多个语句的集合。类似于函数,但不同于函数,可以把块作为表达式或变量的一部分,或者作为参数传递。在作为参数传递块时,代码被作为数据的一部分进行传递。
块具有以下特征:
同函数一样,有类型化参数列表。
有返回结果或者要申明返回类型。
能获取同一作用域(与块所在同一作用域)内的状态。
可以修改同一作用域的状态(变量)。
与同一范围内的其他块同享变量。
在作用域释放后能继续共享和改变同一范围内的变量。
除以上特点外,甚至可以复制块并传递到其他后续执行的线程,编译器和运行时负责把所有块引用的变量保护在所有块的拷贝的生命周期内。当然,这已经超出了本章的范围,可以参考苹果官方文档来了解这些内容。

3.5.2 Objective-C 中的块

对于C和C++,块是变量,但对于Objective-C,块仍然是对象。下面简单介绍Objective-C中的块。
1.块变量声明
用^操作符声明一个块变量的开始,分号表示块结束,如下代码所示:

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

块语法比较奇怪,块变量声明的解释如图3-2所示。

块变量的声明语句从前至后分为了几部分:
返回值类型,如int、double,如果未显式地声明块的返回值类型,可能会自动从块代码中推断返回类型(通过return语句)。
块变量名用括号括住,块变量名前加^符号。
参数类型用括号括住,多个参数以逗号分隔,如果参数列表为void,而且返回类型依靠推断,可以省略参数列表的void。
等号,将后面的块赋值给前面的块变量(即myBlock)。
以^开头并以;结束的块定义。
块定义中又分为以下两个部分(除去开头的^和结尾的;外):
参数列表,同函数的参数列表。
块体,同函数体。
值得注意的是,块可以使用同一作用域内定义的变量,而函数不行。
一旦声明了块,你可以像使用函数一样调用它:

int multiplier = 7;
int (^myBlock)(int) = ^(int num) {
    return num  multiplier;
};
printf ( "%d", myBlock(3));

2.行内块
有时候,你不准备重复使用某个块,因此你不必为它想一个名称。那你可以使用行内块而不用声明为块变量。以下代码来自苹果文档:
// gsort_b类似标准的 gsort_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, 1);
});
// myCharacters 现在是 { "Charles Condomine", "George", TomJohn" }

在qsort_b 方法调用中,第4个参数就是一个匿名的块(行内块)。匿名块跟块变量不同,它没有变量名,因此你无法重用匿名块。下次调用这个块时,必须把整个块定义的代码再复制一遍。
3.__block关键字
块允许访问本地变量。这很重要。它使得我们在线程间共享变量变得简单,而且,你可以规定一个本地变量是否可以写,这可通过使用__block关键字,这是一种类类似register、auto和static存储类型修饰符。
用__block修饰的变量,可以在所有同一作用域内的块,以及块复制之间共享数据。在指定作用域内的多个块能同时使用共享变量。
如同块,__block变量也使用栈存储。如果使用block_copy拷贝块(或者向块发送copy消息),变量被拷贝到堆里。而且,__block变量的地址随后就会改变。
__block变量有两个限制:不能是可变长度的数组,也不能是包含C99可变长度数组的结构体。
下面显示了__block变量的使用:

__block int x = 123; //  x 是块可写的
void (^printXAndY)(int) = ^(int y) {
      x = x + y;
      printf("%d %d\n", x, y);
};
printXAndY(456); // 打印出: 579 456
// x 现在的值是:579

下面显示了在块中使用多种类型的变量:

extern NSInteger CounterGlobal;
static NSInteger CounterStatic;
{
      NSInteger localCounter = 42;
      __block char localCharacter;
      void (^aBlock)(void) = ^(void) {
            ++CounterGlobal;
            ++CounterStatic;
            CounterGlobal = localCounter;
            localCharacter = 'a';
      };
      ++localCounter;
      localCharacter = 'b';
      aBlock();
}
时间: 2024-09-07 11:35:31

《企业级ios应用开发实战》一3.5 块编程的相关文章

《企业级ios应用开发实战》一导读

前 言 为什么写这本书 随着我国3G网络和移动互联网的兴起,许多传统的企业应用正在从桌面向移动终端扩展,移动办公.移动营销.移动作业等需求日渐强烈. 有迹象表明,传统的互联网正在向移动互联网发展.根据摩根士丹利发布的全球互联网发展趋势报告(Mary Meeker 2010)显示:全球互联网发展趋势正在由PC-Internet向Mobile-Internet转变,手机在某种意义上已经主导着互联网的发展,新兴的下一代互联网,即Mobile 2.0正在崛起,这完全得益于移动通信技术的迅猛发展.这不仅仅

《企业级ios应用开发实战》一1.3 iOS企业应用程序的发布

1.3 iOS企业应用程序的发布 除了上述特点,iOS企业应用还有一个显著的特点,就是应用程序的发布方式.iOS企业应用具有两种发布方式:In-House和Ad-Hoc,它们并不经过苹果公司的App Store进行发布,而只是在企业内部进行发布.换句话说,不经过苹果商店的应用程序审核程序. 1.3.1 iOS应用程序发布与App Store 2008年3月6日苹果公司推出了iPhone的应用程序开发包(iPhone SDK),吸引了全世界的开发者.2008年7月11日,App Store正式上线

《企业级ios应用开发实战》一2.3 Cocoa Touch 框架简介

2.3 Cocoa Touch 框架简介 Cocoa Touch框架是进行iPhone应用程序开发工作的主要框架,主要包括UIKit和Foundation(NS)框架,这些库统称为Cocoa Touch框架.该框架完全是面向对象的,它是Cocoa框架的子集. 注意:Cocoa框架早先是用于Mac OS X上的一个面向对象的应用程序快速开发(Rapid Application Development,RAD)框架,包含了Foundation和App Kit框架,可用于开发Mac OS X系统的应用

《企业级ios应用开发实战》一第2章 iOS开发框架简介

第2章 iOS开发框架简介 本章首先介绍苹果操作系统iOS的起源.发展及构成,然后对iOS开发框架Cocoa Touch进行介绍.Cocoa Touch(或Cocoa)是多个开发框架的集合,由多个层级的子框架构成.最后介绍苹果开发工具包iOS SDK及开发环境的搭建.

《企业级ios应用开发实战》一3.3 MVC模式

3.3 MVC模式 MVC模型是应用程序设计者们普遍采用的一种设计模式,在第2章介绍Cocoa Touch框架时曾简单介绍了MVC.MVC模式把应用程序GUI代码根据功能拆分为不同的类或组件: "模型":用于封装应用程序的数据: "视图":负责显示和编辑数据: "控制器":负责处理前两者之间的逻辑关系. 它们之间的逻辑关系参考第2章的图2-3. Cocoa Touch本身也遵循MVC模型原则.在MVC模型下,3个层次都由截然不同的类来实现,

《企业级ios应用开发实战》一2.5 写一个iPhone程序

2.5 写一个iPhone程序 点击桌面上的Xcode图标,启动Xcode.选择菜单"File→New Project",显示新建项目模板向导(如图2-16所示). 在左边栏中列出了Xcode支持的两种项目类型:iOS和Mac OS X项目,选择iOS下方的Application,然后选择Empty Application类型的项目.点击Next按钮,进入新项目设置界面,如图2-17所示. 在新项目设置界面中,在Product Name栏填写项目名称,比如My_First_iPhone

《企业级ios应用开发实战》一2.1 苹果iOS 简介

2.1 苹果iOS 简介 苹果iPhone手机自发布之日以来就给人们带来了全新的感觉和操作体验.一是因为iPhone更为优秀的硬件性能,二是因为苹果手机跨时代的操作系统--苹果iOS. iOS即iPhone OS,是苹果公司针对其iPhone.iPod Touch和iPad产品开发的基于UNIX架构的苹果专属操作系统.原本这个系统名为iPhone OS,直到2010年6月7日WWDC大会上宣布改名为iOS.iOS分为iPhone.iPod Touch和iPad三个版本,但三个版本往往同步更新.

《企业级ios应用开发实战》一2.7 在 iPhone 上运行应用程序

2.7 在 iPhone 上运行应用程序 如果要在iPhone手机上运行程序则没有那么容易了. 正如第1章所述,在开始开发iPhone应用程序之前,你需要注册成为iPhone开发人员.只有这样,苹果公司才会允许你使用"完全的"的SDK,否则你只能下载一个有功能限制的免费SDK. 注册页面位于.苹果将该注册程序称为苹果开发者计划(Apple Developer Plan),其中针对iPhone开发人员的称作iOS开发者程序.在该页面的底部提供了苹果支持的所有注册程序(见图2-29). 在

《企业级ios应用开发实战》一第1章 企业应用的话题

第1章 企业应用的话题 本书是一本关于iOS企业应用开发的书.在本书开篇,首先讨论一下企业应用的话题.包括:什么是企业应用.iOS企业应用.iOS企业应用中所使用的应用程序发布方式Ad-Hoc和In-House,以及iOS 4.0以后新增的无线部署功能.