第3讲 Cocoa与Objective-C
在第2讲中我们已经了解到了要开发桌面应用程序,必须要学习框架与编程语言。开发Mac应用程序以及iPhone应用程序时主要使用Cocoa框架,主要使用的编程语言是Objective-C,本章将介绍关于这两者相关的基础知识。
3.1 框架的使用
我们知道了框架是通过编程语言来调用其相关功能的,那么到底是如何调用的?这就涉及一个新的概念——API(Application Programming Interface),下面会介绍什么是API,以及API与编程语言间的关系。
3.1.1 关于API
在所有的框架中,都拥有调用各种功能用的“窗口”。应用程序就是通过这个“窗口”来操作框架的,这个“窗口”就被称为API,即应用程序编程接口。应用程序与框架,以及API间的关系如图3-1所示。
图3-1 应用程序、框架、API三者间的关系
这也意味着学习框架的用法,就是学习API的用法。框架的使用方便与否,就取决于API的优劣。
我们可以通过了解Cocoa的API,来直观地理解API到底是什么。在Cocoa的API中有负责控制窗口的API,这个API定义在路径为【/系统/资源库/Frameworks/AppKit.framework/Headers/NSWindow.h】的文件中。下面的代码是该文件中的一部分。
… // show/hide resize corner (does not affect whether window is resizable) - (void)setShowsResizeIndicator:(BOOL)show; - (BOOL)showsResizeIndicator; - (void)setResizeIncrements:(NSSize)increments; - (NSSize)resizeIncrements; - (void)setAspectRatio:(NSSize)ratio; - (NSSize)aspectRatio; #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_3 - (void)setContentResizeIncrements:(NSSize)increments; - (NSSize)contentResizeIncrements; - (void)setContentAspectRatio:(NSSize)ratio; - (NSSize)contentAspectRatio; #endif - (void)useOptimizedDrawing:(BOOL)flag; - (void)disableFlushWindow; - (void)enableFlushWindow; - (BOOL)isFlushWindowDisabled; - (void)flushWindow; - (void)flushWindowIfNeeded; - (void)setViewsNeedDisplay:(BOOL)flag; - (BOOL)viewsNeedDisplay; - (void)displayIfNeeded; - (void)display; - (void)setAutodisplay:(BOOL)flag; - (BOOL)isAutodisplay; …
这些就是API的接口函数的定义。相信读者初看上面的代码肯定是一头雾水。一般API都由特定的编程语言编写的,Cocoa框架的API就是由Objective-C语言来编写,如果你不懂Objective-C,当然会一头雾水。因此要学会使用Cocoa框架的API,就必须有Objective-C的基础。
3.1.2 API与编程语言的关系
我们知道,框架的API都是以特定编程语言的方式提供的,要使用框架,就必须学习API中使用的语言。Mac OS X的框架包括其API基本上是使用C语言或者Objective-C(有很小部分使用Java或C++)。如果你有C语言以及Objective-C语言的知识,就能使用绝大多数框架了。
但是,如果说框架已经决定了使用哪种的编程语言,有人会不满意了,认为还是使用自己熟悉的编程语言比较方便,那么就必须将开发将框架的API转换为其他语言的程序,称为桥(bridge)或封装(wrapper)。实际上在Cocoa框架中就有封装,这样除Objective-C以外的编程语言也能够调用Cocoa了,详细请见3.3节的相关介绍。
3.2 Objective-C的发展史
对于在Cocoa应用程序开发中使用的Objective-C语言,我想应该很多人以前都没有听说过。这里简单地介绍一下Objective-C这门编程语言的发展历史,以及与其他编程语言间的关系。Objective-C语言的发展史可以用一张图来概括,如图3-2所示。
图3-2 Objective-C语言的发展史
1. Objective-C以C语言为基础
Objective-C是在C语言的基础上发展而来。C语言产生于1973年,以C语言编写程序要经过编译(compile)后再运行,是一种比较低级的语言。
2. 受面向对象语言Smalltalk影响
Objective-C还受了另一种语言——Smalltalk的影响。Smalltalk开发于20世纪70年代,被称为是纯粹的面向对象型语言。
3. Objective-C的诞生
Objective-C语言诞生于1983年。在C语言中结合了Smalltalk风格的面向对象语法成就了Objective-C语言,同时其具有以信息传递方式实现面向对象型语法,以及C语言本来具有的灵活性这两个特征。
4. C++的影响
在以C语言为基础的面向对象语言中,还有C++语言。相对于Objective-C来说,C++更专业了。C++的流行难免对Objective-C的发展施加了一定的影响。
5. 受其他面向对象语言的影响
进入20世纪90年代后,迎来了面向对象语言发展的全盛时期,很多面向对象的语言登场了,有受C++影响的Java,脚本型语言Python与Ruby。这些语言与Objective-C的兼容性不错,为此开发了不少桥程序库。
6. Objective-C与C++的结合
为了可以在Objective-C中调用C++的类库,产生了Objective-C++语言,进一步扩展了Objective-C的功能。
7. Objective-C 2.0的诞生
2007年在Objective-C的基础上进行扩展而诞生了Objective-C 2.0,实施如语法的扩展,增加随机垃圾回收等新的内容。
3.3 用于其他语言中的Cocoa API
3.3.1 通过桥调用Cocoa
Objective-C是一门非常简单的语言,很容易编写与其他语言连接的桥程序。有了桥程序在其他语言中也可以调用Cocoa框架的功能了。而实际上,在Cocoa中提供了其他语言使用的API,下面会一一做简要介绍。
1. Java
为Java准备的Cocoa API,自从Mac OS X刚开始推出时就已经存在了,其被称为Cocoa-Java,能够使用几乎Cocoa的所有功能。
但是,Apple公司已经明确宣布Mac OS X 10.4版本以后不支持Cocoa-Java了。
2. Ruby
在Ruby程序中也可以使用Cocoa,被称为RubyCocoa框架。RubyCocoa的支持网站有http://RubyCocoa.sourceforge.net/。
从Mac OS X 10.5版本开始标准搭载RubyCocoa。
3. Python
Python与Objective-C间桥程序被称为PyObjC,支持网站有http://pyobjc.sourceforge.net/。有了这个PyObjC就可以在Python程序中调用Cocoa API了。
3.3.2 是否应提倡在Objective-C以外的语言中调用Cocoa API的开发方式
既然在Cocoa中提供了这么多Objective-C语言以外的API,那么可以使用这些语言进行编程,然后使用与此语言对应的API,应该也很方便,而且不用再学习一门新语言——Objective-C了。下面从几个实际的情况来探讨一下这个问题。
1. 编程入门者的情况下
对于没有编程经验的入门者来说,当然推荐其使用Objective-C了,最大的理由就是Objective-C比较简单,相对于Java、Ruby、Python等语言来说,Objective-C学习起来要简单多了。
另外,许多人对桥API多少还有些不放心。通过桥来调用Cocoa,其实是在原来的Cocoa API的外面披上了一层皮,因为有了这层皮,发生意想不到问题的概率就会增加。如果开发时碰到问题就要浪费大量时间。
因此对新手来说,尽量在一个简单的环境中工作会更好,因此选择Objective-C就是最好的选择。
2. 开发Mac OS X桌面应用程序的情况下
如果想充分利用Mac OS X的功能开发桌面应用程序时,还是选择Objective-C比较好。为什么呢?在第2讲中我们已经提到,在Mac OS X中不仅仅是Cocoa框架,还有许多提供各种功能的框架,除了使用Cocoa,还可能会使用其他框架。而其他框架的API都是以Objective-C或者C语言形式提供的。如果使用Objective-C就可以方便地调用,而从Java、Ruby、Python中是没有办法直接调用的(从Mac OS X 10.5开始追加了名为桥支援的功能,能很方便地制作针对所有框架的桥)。
因为iPhone SDK都是以Objective-C或者C语言开发的,与开发Mac桌面应用程序时的情况一样,现在Objective-C是最好的选择。当然也可以使用HTML+CSS+JavaScript来开发iPhone应用程序,但是这样就不能使用iPhone SDK提供的强大功能了。
3. 已熟练掌握Java、Ruby或Python的情况下
这种情况下,使用各自的桥来开发也是不错的选择。不管Objective-C多么简单,要掌握一门新的语言还是需要时间的。这时候使用自己早已习惯的语言进行开发,速度更快。另外,从Mac OS X 10.5开始追加了名为桥支援(bridge support)的功能,能很方便地制作针对所有框架的桥。这样Ruby,Python就更能发挥其作用了。
4. 在Java、Ruby或Python中使用既存库
例如,在使用Ruby开发应用程序时,也想拥有类似于Mac一样的用户界面。这时候就可以发挥桥的作用。特别是在Ruby或Python中没有标准的GUI框架,使用Cocoa来实现是一个不错的选择。
3.4 解答与Objective-C相关的几个疑问
前面几节中我们了解了不少关于Objective-C的相关知识,特别是学习了关于Objective-C的发展史后,很自然会有一些疑问。下面就以问答的方式解释其中的几个问题。
1. 是否需要先掌握C语言,以及Smalltalk?
我们知道,Objective-C是以C语言为基础发展而来的,同时也受到了Smalltalk的影响。那么要更好地掌握这门语言,是否需要先掌握C语言,以及Smalltalk呢?
首先,需要掌握C语言的知识。因为Objective-C的语法就是从C语言移植过来的,变量的定义、结构控制语法等与C语言完全一致,因此需要掌握C语言的基本语法知识。
另一方面,没有Smalltalk的语法知识不要紧。Objective-C的确是受到了Smalltalk的影响,但语法是Objective-C所独有的。这些可以重新开始学习。
2. Objective-C这样冷门的语言不好学吧?
Objective-C的确是一种冷门的语言,我想读者在逛书店时就能感受到,介绍如Java,C#等语言的书籍排满了书架,而Objective-C的书籍最多一两本而已,使用人数也少很多。
但是,你完全不用为此发憷,Objective-C学习起来还是比较简单的,其语法与C++或Java比较起来简单多了,上手也快。因此对于初次接触编程的人来说,能更快速入门。它还有一个优势就是能立即体验到面向对象编程思想。
而对那些已经具有编程经验的程序员来说,Objective-C就更有意思了,因为它所处的位置非常独特。对具有C++或Java编程经验的人来说,能体验到动态判别类型的编程经验。对于Python或Ruby程序员来说,能进行接近计算机底层的编程,可以编写出性能更高的应用程序。
总之,Objective-C是一门非常有趣的语言。
3. Objective-C也能广泛地应用在Windows或Linux平台上吗?
这个就不要有过高的期望了。
在Windows或Linux平台上是能运行Objective-C应用程序的,这里再说明一下,开发应用程序时,编程语言与框架缺一不可。在Windows或Linux平台上,没有Objective-C可使用的框架。Objective-C其实算是Cocoa的专用语言了,因此,离开Cocoa以外的广泛运用不宜寄托太高的期望。
4. Objective-C将来会消失吗?
许多人对于冷门语言经常担心它的发展,那么Objective-C在将来会不会消失?这完全不用担心,看一看现在Apple公司手持设备如火如荼的销售形势,可见将来Apple公司会对Objective-C一直支持下去的。
在Mac的产品中,随着Mac OS X的出现,Objective-C就开始使用了,现在已经使用于iOS平台。到今天为止,很多的框架都是使用Objective-C编写而成的。而且,2007年在Objective-C的基础上发布了经过扩展的Objective-C 2.0。这也是Apple公司将继续使用Objective-C的信息。
因此我们大可放心,只要Mac OS X存在一天,Objective-C就不会消失。