前言
C程序设计语言是由AT&T贝尔实验室的Dennis Ritchie于20世纪70年代早期首创的。但是,直到20世纪70年代晚期,这种程序设计语言才获得了广泛的支持并流行开来。因为在此之前,C编译器还不能用于贝尔实验室以外的商业用途。最初,UNIX操作系统有可能更快的普及速度也在某种程度上促进了C语言的快速普及,UNIX操作系统几乎完全是由C语言编写的。
Brad J.Cox在20世纪80年代早期设计了Objective-C语言,它以一种叫作SmallTalk-80的语言为基础。Objective-C在C语言的基础上加了一层,这意味着对C进行了扩展,从而创造出一门新的程序设计语言,支持对象的创建和操作。
(咨询特价)年,NeXT计算机公司获得了Objective-C语言的授权,并发展了Objective-C的语言库和一个开发环境,即NEXTSTEP。1992年,自由软件基金会的GNU开发环境增加了对Objective-C的支持。所有Free Software Foundation(FSF)产品的版权归FSF所有。它以GNU通用公共许可证来发布产品。
(咨询特价)年,NeXT计算机公司和Sun公司联合发布了一个针对NEXTSTEP系统的标准规范,名为OPENSTEP。OPENSTEP在FSF’s的实现名称为GNUStep。有一个Linux版本,它包括Linux内核和GNUStep开发环境,这个Linux发行版被十分贴切地命名为LinuxSTEP。
(咨询特价)年12月20日,苹果公司宣布收购NeXT软件公司,NEXTSTEP/OPENSTEP环境将成为苹果操作系统下一个主要发行版本OS X的基础。这个开发环境的版本被苹果公司称为Cocoa。它内置了对Objective-C语言的支持,并结合了ProjectBuilder(或它的后继版本Xcode)和Interface Builder等开发工具,苹果公司为MacOS X上的应用程序开发创建了一个功能强大的开发环境。
(咨询特价)年,苹果公司发布了Objective-C语言的升级版,并称为Objective-C 2.0。本书第2版已涵盖了该版本语言的内容。
当iPhone于2007年发布时,开发人员们要求为这款革新性的设备开发应用程序。起初,苹果公司不欢迎第三方应用程序开发。苹果公司安抚那些超级崇拜iPhone的开发人员的办法,就是允许他们开发基于Web的应用。这些基于Web的应用在iPhone内置的Safari Web浏览器下运行,但需要用户连接到托管该应用程序的网站。基于Web应用的很多固有限制,开发人员对此非常不满,于是苹果公司不久之后就宣布,开发人员能够为iPhone开发所谓的本机应用。
本机应用是驻留在iPhone上并且在iPhone操作系统下运行的应用,其运行方式与该设备上运行的内置iPhone应用(如Contacts、Stocks和Weather)相同。iPhone的操作系统实际上是某个OS X版本,这意味着可以在MacBook Pro上开发并调试这些应用。实际上,苹果公司很快就提供了强大的软件开发套件(SDK),允许快速开发iPhone应用并进行调试。iPhone模拟器使得开发人员能够直接在开发系统上调试其应用,而无须在真机设备上进行。
随着2010年iPad的推出,苹果公司开始统一操作系统上使用的术语和SDK,以支持使用不同尺寸的物理屏幕和屏幕分辨率的各种设备。在本书写作时已能够通过iOS SDK为各种iOS设备开发应用程序,当前发布的操作系统版本为iOS 7。
1.1 本书内容
在计划编写这本有关Objective-C的图书时,我必须做出一些基本的决策。和其他介绍Objective-C的内容一样,可以假定读者已经知道如何编写C语言程序。可以从使用丰富的例程库(例如,Foundation框架和UIKit框架)的角度介绍这门语言。介绍如何使用一些开发工具(如Mac的Xcode和设计UI使用的Interface Builder等)。
但是采用这种方式有一些问题:首先,学习Objective-C之前必须完整地学习C语言,这种说法是错误的。C语言是一门过程性的编程语言,有很多特性是在使用Objective-C进行程序设计时不必要的,特别是对于初学者。事实上,采用其中的某些特性违反了坚持良好的面向对象的程序设计方法的本质。同样,在学习面向对象的编程语言之前,最好不要了解过程性语言的所有细节。这会导致程序员误入歧途,并在养成良好的面向对象的程序设计风格方面造成错误的导向和思维定式。Objective-C是C语言的扩展,但这并不意味着必须首先学习C语言。
因此,我既不首先讲述C语言,也不事先假定你具备了该语言的知识。相反,我决定采用一种非常规的方尸从面向对象编程的视角出发,将Objective-C和基础的C语言作为一门单独的集成语言来讲解。顾名思义,本书的目的是教你如何使用Objective-C 进行程序设计。这并不表示我会详细介绍可用于开发和调试程序的工具,或者讲解如何开发交互式图形应用。学会如何使用Objective-C编写程序后,所有的这些资料都可在其他地方获得。事实上,你会发现在具备了如何使用Objective-C进行程序设计的坚实基础后,掌握这些知识是轻而易举的。本书并不假设读者需要编程经验,即使有,也不会很多。如果你是一名程序设计的初学者,通过一些努力,你应该可以将Objective-C作为第一门程序设计语言。根据本书前几版的反馈,其他读者已经做到了。
本书以示例的方式讲述Objective-C语言。在介绍这门语言的每个新特性时,通常会提供一个完整的小例子来阐述这一特性。正如“一图胜千言”一样,一个经过严格筛选的例子也有如此功效。强烈建议运行每个程序,并比较系统中获得的结果与本书中的结果。这么做,你不仅可以学会Objective-C语言及其语法,而且还能熟悉编译和运行Objective-C程序的过程。
1.2 本书组织方式
本书从逻辑上分为三部分:第一部分(第1~13章)是“Objective-C语言”,介绍该语言的基础知识。第二部分(第14~19章)是“Foundation框架”,讲述如何使用构成Foundation框架的种类丰富的预定义。第三部分(第20、21章)是“Cocoa、Cocoa Touch和iOS SDK”,简要介绍Cocoa和Cocoa Touch框架,然后逐步演示如何使用iOSSDK开发简单的iOS应用。
框架就是一组从逻辑上组合在一起的类和例程,它们使开发程序变得更加容易。使用Objective-C进行程序设计时需要的许多能力都来源于大量可用的框架。
第2章“Objective-C编程”,首先讲述如何使用Objective-C编写第一个程序。
因为本书并非主要讲解Cocoa或者iOS程序设计,所以在第三部分之前没有过多地介绍图形用户界面(GUI),甚至很少提及它。这就需要使用一种方法实现程序输入并产生输出。本书中的大多数例子都是从键盘获得输入,并在一个窗口中产生输出的:如果在命令行中,那么这个窗口是Terminal窗口;如果使用Xcode,那么这个窗口是调试输出窗口。
第3章“类、对象和方法”,介绍了面向对象程序设计的基础。本章引入了一些术语,但数量控制到了最少。另外还介绍了定义类的机制,以及向实例或对象发送消息的方式。教师或者有经验的Objective-C程序员将会注意惮本书使用静态类型声明对象。我认为这种方法是学生起步的最好方尸因为编译器能捕捉更多的错误,程序有更强的自文档化(self-documenting)功能,同时还能鼓励新程序员显式地声明已知的数据类型。这样,id类型的概念及其强大功能直到第9章“多态、动态类型和动态绑定”才会完全展现出来。
第4章“数据类型和表达式”,描述了基本的Objective-C数据类型,以及如何在程序中使用它们。
第5章“循环结构”,介绍了在程序中可以使用的3种循环语句,即for、while和do。
第6章“选择结构”,详细讲述了Objective-C语言的if和switch语句。判断语句是任何计算机程序设计语言的基础。
第7章“类”,更深入地研究了类和对象的使用,详细讨论了方法、方法的多个参数及局部变量的相关内容。
第8章“继承”,介绍了继承的主要概念。这一特性使得程序更容易开发,因为我们可以利用以前编写的代码,使用继承及子类的概念可以方便地修改和扩展现有的类定义。
第9章讨论了Objective-C语言的3个重要特性。多态、动态类型及动态绑定是本章的关键概念。
第10章至第13章对Objective-C进行了深入讨论,既包含对象的初始化、区块、协议、分类、预处理程序,还包括一些基本的C语言特性,如函数、数组、结构和指针。第一次开发面向对象的程序时,通常不必(最好避免)使用这些特性。建议你首次通读本书时略过第13章,只在需要更多地了解这门语言的特殊特性时,再回来学习它。
第二部分从第14章开始,这部分介绍Foundation框架,以及如何使用它的大量文档。
第15章至第19章讲解了Foundation框架的重要特性,包括数字和字符串对象、集合、文件系统、内存管理及对象的复制和归档。
学习完第二部分后,你将能够使用Foundation框架开发出相当复杂的Objective-C程序。
第三部分从第20章“Cocoa和Cocoa Touch简介”开始,本章简要介绍了框架,它提供了在Mac和iOS设备上开发复杂图形应用所需的各种类。
第21章介绍了iOS SDK和UIKit框架。本章阐述了如何以迭代的方式编写简单的iOS应用,然后列举了一个计算器应用的示例,通过它可使用iPhone进行简单的分数算术运算。
因为面向对象的用语涉及大量术语,所以本书附录A提供了一些常用术语的定义。
附录B“地址簿示例源代码”,给出了本书第二部分中开发并大量使用的两个类的源代码。这些类定义了地址卡和地址簿类,其中的方法提供了一些简单的操作,如在地址簿中添加和删除地址卡、查找某人、列出地址簿的内容等。
学会如何编写Objective-C程序后,可以继续向几个不同的方向发展。你可能希望学习有关C语言的更多内容,或开始编写在OS X上运行的Cocoa程序,或者你可能想开发更复杂的iOS应用。
1.3支持
读者可在classroomM.com/objective-c论坛查找到更加丰富的内容,可以获取到一些源代码(这里并不能找到所有例子的“官方”源代码,本人坚信学习过程的最大一部分在于自己输入例子中的程序,并且学习如何判断和修正错误)、练习的答案、勘误表和测验题;也可以向我或其他论坛中的成员提问题。这个论坛有积极的成员,他们乐于帮助其他成员解决疑问,并且答复一些问题,使之变成内容丰富的社区。请加入并参与进来吧!
1.4 致谢
我要感谢在本书第 1 版的准备阶段为我提供帮助的朋友们。首先,要感谢TonyIannino和Steven Levy对原稿的审阅,并感谢Mike Gaines对本书的贡献。
其次,还要感谢本书的技术编辑Jack Purdum(第1版),Wendy Mui(第3版)和Mike Trent(第1,2,5,6版)。我格外地幸运,因为Mike审阅了本书的两个版本,他对我编写的本书前两版都进行了最详细的审阅,不仅指出了书中的不足之处,而且还十分慷慨地提出了建议。正是因为Mike对第1版提供的意见,我改变了介绍内存管理的方法,并尽力确保本书中的每个示例都是“无漏洞的”。在第4版之前,内存管理是比较重要的内容,但引入ARC后,这部分内容变得过时了。Mike还为有关iPhone程序设计的章节做出了很多贡献。
在第1版中,Catherine Babin提供了封面的图片,他还提供了许多有价值的图片供我选择。朋友为我制作的封面的艺术效果,使得本书具有更强的专业性。
我非常感谢Pearson的Mark Taber(所有的版本),他忍受了我的推迟交稿,并且非常和蔼地让我按照自己的进度工作。同样的荣誉给皮尔逊的Mandie Frank。Mandie为我的延迟交付不知疲倦地工作,以帮助本书的各种版本及时出版。我非常感谢Michael de Haan和Wendy Mui不可思议地主动要求完成校对第2版的工作。
注意
正如先前介绍的,Dennis Ritchie发明了C语言,他也是UNIX操作系统的共同发明者,这是OS X和iOS的基础。但遗憾的是,2011年,在一个星期内这个世界失去了Dennis Ritchie和Steve Jobs。这两位对我的职业生涯有重大的影响。如果没有他们,这本书也就不存在。
最后,我要感谢classroomM.com/objective-c论坛的会员对我的反馈、支持和鼓励。
1.5 第6版前言
上个版本没有多少变化。由于Xcode 5的引入,所有的截图已被更新。我这样做是为了让新手也能跟随当前截图,不至于在学习之前迷茫!有一些语言细节的增加,也已反映在此版中。
Stephen G.Kochan
(咨询特价)年10月