20天搞定iPhone软件开发
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

第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就不会消失。