3.4 Mac 编程基础

这里我们重点讲述在 Mac OS X 上编程相关的技能。

3.4.1 你必须掌握的技能

一些周知的行业基础技能就不多说了,像标准 C++、计算机英语这些都是必需的,下面 是在 Mac 上做开发需要的技能:

  • 熟练使用 Mac OS X 系统
  • 了解 Mac OS X 的系统架构
  • 熟悉 Mac OS X 文件系统
  • 了解 Carbon 环境
  • 熟悉 Cocoa 环境
  • 熟练使用 Xcode
  • 能够使用其它的编程工具辅助开发

3.4.2 Mac OS X 的系统架构

首先我们通过下面的图 3-6 了解一下 Mac OS X 系统的主要架构,它忽略了一些细 节,但是比较清晰的描绘了系统的主要组件和相互间的关系。

图 3-6 Mac OS X 系统架构简图

同现代其它的操作系统一样,在其内部结构上, Mac OS X 的是积木式的层次集合。这 种结构的特点是,系统的较低层实现包含有上层软件所依赖的基础服务,比如 OpenGL 框架 可能担负底层绘图任务,而内核层则负责任务调度或硬件管理。

图 3-6 给出的是 Mac OS X 的系统架构图,从中可以看到,系统最底层主要包含 Darwin,它是系统的核心;它的上层是绘图与媒体层,为播放音频视频、渲染 2D/3D 图形 提供了强大而专门的服务;再往上则是系统的 Framework 层,包含 Cocoa、Carbon 等应用 程序框架,这里是我们要学习的主要内容;最上层则是用户层体验层,包含 Aqua 和 Spotlight 等)令 Mac OS X 与众不同的方法、技术和应用程序, 其中 Aqua 是 Mac OS X 的用户界面, 对于一般的使用用户而言, Mac OS X = Aqua。

更为详细的 Mac OS X 分层结构请参见图 3-7。

图 3-7 Mac OS X 架构图

3.4.3 Mac OS X 文件系统

在任何一个操作系统当中,文件系统都是非常重要的部分,毕竟每个用户都需要在文 件系统中保存自己的资料。在 Mac OS X 系统中,文件系统的组织结构扮演了非常重要的角 色,它能够帮助用户找到想要的文件。这种组织结构同时也让应用和系统本身在为满足用户 需要而查找文件资源的时候更加简单快捷。

Mac OS X 中的文件系统内核中有一套从 BSD 操作系统中继承而来的目录结构体系。 虽然大部分目录都被 Finder 所隐藏,但是 BSD 世界中的很多元素都显露无遗。其中文件权 限模型、符号链接以及用户目录等概念都来自于 BSD。Mac OS X 系统还增加了一些它自己 的概念用来向用户提供一个安全精致的环境对文件和文件夹进行管理。

Mac OS X 在满足了用户期望的易用性的同时,它的设计目标也提供了强大和灵活的功 能特点。在这点上,这种文件系统向用户提供一种统一的目录结构,从而使用户可以很容易 的找到资源。(这种统一风格对开发者也非常有用,他们开发的应用有时需要知道去哪里能 找到某些重要的资源。) 还有其它的一些文件系统固有风格,比如别名、扩展名隐藏和显示 名称等等都能够改善用户的使用感受。

Mac 文件系统涉及的内容很多,这里只介绍与 Qt 开发有紧密联系的部分。 1.文件系统域 在多用户系统中,控制用户对系统资源的访问对于维护系统的稳定是非常重要的。 Mac OS X 系统定义了好几种文件系统域,每种文件系统域都提供了固定的文件夹用于存储系统资源。在每种域当中,对资源的访问权限是由当前用户的权限决定的。

一共有四种文件系统域,用户域、本地域、网络域和系统域。

(1) 用户域

用户域中包含了某个用户专有的资源。用户域由当前登录用户的 home 目录表示。Mac OS X 计算机的每个用户在这个计算机上或者这个计算机所链接的本地局域网中都应该有一 个帐号。每个用户帐号在文件系统中都有一个分配的空间,这个空间被叫做用户 home 目 录。这个目录中存放了用户的程序、资源以及文档。用户 home 目录的名称基于用户的登录 名称,该名称必须是唯一的。

用户域使每个用户拥有一个可以定制的工作环境成为可能。在用户登录的时候, Finder 会根据用户域中的偏好设置,载入该用户上次的工作环境和设置。类似的,应用程 序以及其它系统软件也能够利用用户域中的信息载入:应用偏好设置、网络设置、电子邮件 设置、字体设置、ColorSync 配置以及其它设置。

用户 home 目录的位置取决于用户帐号。如果用户帐号是计算机的本地帐号,那么用 户的 home 目录就在启动卷的 Users 目录当中。而如果用户帐号是一个网络帐号,那么 home 目录就在网络服务器上。如果不考虑 home 目录的物理位置,Mac OS X 还沿用了 UNIX 系统的惯例,在某些时候用~ (波浪号)字符来表示用户的 home 目录。这个波浪号可 以和其它目录名或者用户名结合起来使用,表示特定的用户目录。表 3-9 对这个概念有所 说明。

表 3-9 利用波浪号表示 home 目录中的位置

~ 当前用户 home 目录的最高一层
~/Library/Fonts 当前用户 home 目录中保存字体的目录
~Steve 用户 Steve 的 home 目录最高一层

每个新用户的 home 目录都会包含一些缺省目录和资源。 表 3-10 列出了你可能会在 用户 home 目录中看到的一些常见目录。

表 3-10 Home 目录的内容

用户目录 描述
Applications 包含仅仅当前用户可用的应用
Desktop 包含了 Finder 在当前登录用户桌面上显示的桌面项
Documents 包含了用户的个人文档
Library 包含了应用设置、偏好设置一起其他用户专有的系统资源
Movies 包含了 QuickTime 以及其它格式的数字影片
Music 包含数字音乐文件 (.aiff、.mp3、.m4p 及其它格式)
Pictures 包含各种格式的图像文件
Public 包含了用户需要和其他用户共享的内容。缺省情况下,其他用户可以访问这个目录
Sites 包含了用户个人网站的网页。如果需要其他用户能够访问这些网页,需要使 Web 共享

当用户帐号创建时,Applications 目录不会自动创建到他的 home 目录中。不过,用户可以自己创建一个 Applications 目录,并把自己的应用放进去。系统会自动在这个位置 搜索应用。

系统通过一系列缺省权限保护用户 home 目录中的文件和目录不受外界影响,用户也 可以在任何时候改变这个缺省权限设置。用户创建的任何目录也都会继承其上层目录的权限 设置。

除了每个用户的 home 目录,Users 目录也包含一个 Shared 子目录。本地计算机上 的所有用户都可以访问该目录,只有用户可以访问该目录,应用不能将自己的内容存放在这 里,除非用户指定这么作。任何用户都可以往这个目录中写入文件、从中获取文件或者读取 其中的文件。尽管这个目录与用户域无关,但是它为用户之间交换文档和其它文件提供了一 个方便的途径。

(2) 本地域

本地域中包含了本地可用但是系统运行时不需要的那些资源。本地域中的资源通常会包含应用、工具、定制字体、定制启动项以及全局应用设置。本地域并不会对应一个单独的物理目录,而是包含了本地 boot ( 和 root)卷中的几个目录。拥有管理员权限的用户可以 在这个域中增加、删除和修改内容。 root 卷中的 Applications 和 Library 目录包含了本地域的资源。计算机系统的当前用户是可以访问这些资源的,但是网络中的其它计算机上的 用户无法访问。

计算机管理员如果需要这个系统中的所有用户共享一些资源的话,他可以把这些资源 安装到本地域当中。Apple 系统中应用都在/Applications 和 /Applications/Utilities 目录中。第三方应用和工具也应该在这个目录中。其它的系统资源,比如字体、 ColorSync 配置、偏好设置以及插件都应该安装在 Library 目录下适当的子目录中。

(3) 网络域

网络域中的资源包括:本地局域网中的所有用户共享的应用和文档。这个域中的内容通常都位于网络文件服务器,并且在网络管理员的控制之下。 表 3-11 显示了网络域中的部分目录。

表 3-11 网络目录

位置 描述
/Network/Application s 包含了本地网络中所有用户都能够运行的应用
/Network/Library 包含了一些本地网络中所有用户都可以使用的资源,如插件、文档、框架、色彩以及字体
/Network/Servers 包含了组成本地网络的所有 NFS 文件服务器的挂接点
/Network/Users/ 包含了所有本地网络用户的 home 目录。这是 home 目录的缺省路径

(4) 系统域

系统域包含了 Mac OS X 相同运行时候需要系统软件和资源。系统域中的所有资源都 位于 root 卷的 /System 目录中。这些资源都由 Apple 提供,只有 root 用户可以修改该 目录中的内容。

每个资源所属的域说明了系统用户对这个资源是否可以应用或者访问。比如,一个安 装在某用户 home 目录当中的字体只能被该用户使用。如果一个管理员在网络域中安装相同 的字体,那么所有网络用户就都可以访问它了。

缺省情况下,/System 目录只包含了一个 Library 子目录。这个子目录中包含了许多 与系统中其它库目录中相同类型的资源。不过,在系统域中,这个目录中还包含了一些核心 服务、框架以及组成 Mac OS X 系统的应用。

Mac OS X 系统对于每个域都提供了一套初始目录用来组织其中包含的资源。 Mac OS X 系统在不同的域之间都会使用相同的目录名称保存相同类型的资源。这种名称一致性能够使 用到这些资源的用户或者系统更加容易的查找资源。当系统需要查找某个资源的时候,它会 依次查找各个域,直到找到想要的资源。搜索开始与用户域,然后依次查找本地域、网络域 和系统域。

2.库目录

库目录是一个专门用来存储与应用相关的和与系统相关的资源的目录。每个文件系统域都有一个它自己的库目录拷贝,其访问级别与域类型是相匹配的。尽管应用可以利用这个目录存储内部数据或者临时文件,可是该目录并不是用来存储应用包本身以及用户数据文件 的。应用包存在于某个适当的/Applications 目录,而用户数据存在于用户的根目录下。

库目录还包含了许多标准的子目录。由于系统例程会假定其中许多子目录是存在的, 所以尽量不要删除这些标准目录。

表 3-12 列举了对开发人员来说最相关的目录。你可以根据这个表来确定在哪里存储你 的软件所需要的文件,当然这个表并不是完整的。

表 3-12 库目录的子目录

Application Support 包含了应用相关的数据以及支持文件,比如第三方的插件,帮助应用,模板以及应 用使用到但是并不需要用来支持运行的额外资源文件。按照惯例,所有这些内容都 会被存储在以应用名称命名的子目录当中。比如,MyApp 应用所用到的第三方资源 应该在 Application Support/MyApp/ 目录中。需要注意,必须的资源文件应该 在应用包当中
Assistants 包含了帮助用户进行配置或者其它任务的程序
Components 包含了系统包和扩展
Contextual Menu Items 包含了用于扩展系统级菜单的插件
Documentation 包含了供计算机用户和管理员参考的文档文件和 Apple 帮助包。(Apple 帮助包在 Help 子目录当中。) 在本地域中,这个目录包含了 Apple 公司发布的帮助包(不 包括开发者文档)。
Keyboards 包含了键盘定义

3.开发者目录

Xcode 工具 CD 中包含了开发 Mac OS X 系统软件所需要的应用、工具、文档以及其 它资源。开发者可以在安装 Mac OS X 系统的时候分别安装以上工具。在安装这些工具的时 候,安装程序会把所有的软件组件放在启动卷的 /Developer 目录中。表 3-13 列举了这个 目录的内容。

表 3-13 发者目录的子目录

目录 内容
Applications 包含了用来管理和构建软项目的应用。这些工具包括 Xcode 以及接口构造器,它们可以用来窗代码和生 成接口。它还包含了一套性能工具、Java 工具、图形工具以及通用工具
Documentation 包含了另外一些与开发者相关的文档
Examples 包含了按照通用类型组织起来的范例项目。这些项目都是完全可以工作的,这些可以编译运行的项目可以 帮助你更多的了解 Mac OS X 系统
Makefiles 包含了用来编译和转换遗留项目的 makefiles 以及 jamfiles
SDKs 包含了用来为旧版本 Mac OS X 系统开发软件的软件开发工具包。每个 SDK 都包括 Mac OS X 特定版本 的头文件和 stub 库
Tools 包含了命令行开发实用工具,包括那些用于创建和操作 HFS 资源 forks 的工具

4.文件操作命令

再次提醒,Mac OS X 是类 Unix 系统,所以它的绝大多数文件操作命令与 Linux 是一致 的,这里不详细展开,介绍几个实用的技巧。

  • 在 Mac OS X 中是区别大小写字符的 比如 A.txt 不等于 a.txt。

  • 系统的根目录标志 / 并不是可有可无的

    cd /System 表示转到根目录下的 System 中,而 cd System 表示转到当前目录下的 System 中,请大家注意其中的区别。

  • 如何进入命令行操作模式

    在图形界面下,用 finder 打开 应用程序 》实用程序》终端 如果连图形界面都进不去了(比如安错了显示驱动),开机时按 F8,用 -s 参数启动,然后输入命令 mount -uw /

  • 用 Tab 键自动补齐命令

    比如你想到 /System 目录中去,输入 cd /Sy 然后按一下 Tab 键,命令就会自动补齐成 cd /System

  • 操作带名字中带有空格的文件和目录

    空格在命令中写成 \空格, 比如要进入 My Documents,命令为 cd My\ Documents

  • 查看命令的详细帮助

    命令是:man 命令名,比如要看看 ls 命令的详细用法,执行 man ls。

需要特别指出的是,大家不要有 Windows 下的盘符概念。Mac OS X 的所有文件都挂在根目录 / 下面。硬盘都挂在 /Volumes 下。比如你的移动硬盘叫做 USBHD,那么接上后桌面上会显示出一个硬盘图标,它实际在哪里呢?你在终端里执行 ls /Volumes/USBHD, 看看 显示出的是不是这个移动硬盘的内容。表 3-14 列出了常见的一些目录:

表 3-14 Mac OS X 常见目录

根目录位置 /
驱动所在位置 /Systme/Library/Extensions
用户文件夹位置 /User/用户名
桌面的位置 User/用户名/Desktop
硬盘挂载位置 /volumes/YourHdName

3.4.4 Cocoa 应用开发简介

Cocoa Framework 简称 Cocoa,是 Mac OS X 上原生支持的应用程序开发框架 。从 1989 年至今 ,Cocoa 一直在努力改进和完善。它设计优美,适合 RAD( Rapid Application Development)。无论你是资深的 Mac 开发“老鸟”,还是即将踏入 Mac 开发世界的新人, Cocoa 都是构建 Mac OS X 应用程序最强大、最高效的工具之一。

Cocoa 应用程序已经逐步成为 Mac OS X 的规范。 例如 iPhoto 和 Safari 都 是 Cocoa 应用程序,这些应用程序以设计巧妙的聪明的设计,丰富的功能以及吸引人的用户界 面得到了广泛的好评,而这些归根结底都是 Cocoa 的功劳。

1.Cocoa 环境

与许多的应用程序环境一样, Cocoa 同时拥有一个运行时间外观和一个开发外观。在 它的运行时间外观里, Cocoa 应用程序呈现 Aqua 的外观,并且能够与操作系统的其它部 分如可视化部件、应用程序等紧密结合。

Cocoa 的开发外观是一套集成的面对对象的软件构件,它使得开发人员创建 Mac OS X 应用程序成为一件容易和快乐的事情。使用 Cocoa,你可以在 Mac OS X 的世界里“为所欲 为”。

在开发 Cocoa 软件时主要的语言是 Objective-C , Objective-C 是 ANSI C 的一个超集,它扩展了特定的语法和语意功能(从 Smalltalk 衍生出来)来支持面对对象的编程。添加的不多的约定都比较简单而且容易学习和使用。因为 Objective-C 以 ANSI C 为 基础,您可以自由的混合使用纯 C 语言代码和 Objective-C 代码。

2.Cocoa 在 Mac OS X 中的位置

图 3-8 准确的描述了 Cocoa 在 Mac OS X 架构中的位置。Mac OS X 由一系列软件层组 成,自下而上分别是最底层的 Darwin ,中间的“核心服务”和“应用服务”层,上层软 件依赖下层软件提供的服务才能运行。 Mac OS X 中全部组成部分,包括 Cocoa ,最终都依 赖 Darwin 才能工作。

图 3-8 Cocoa 在 Mac OS X 的架构中

3.4.5 Xcode 简介

Xcode 是 Apple 自己开发的,只运行在 Mac OS X 平台下的 IDE。如果你想真正了解 Mac OS X 平台上的开发,就应该了解它。当然, Mac OS X 实现了 POSIX,固然也支持传统的 UNIX 编程环境;Eclipse 等 Java 开发工具也有 Mac OS X 版。不过这些,你在 Linux 或者 Windows 平台也能体验到。注意,Xcode 只是一个 IDE,Apple 并没有自己专属的编译器。 事实上创建项目的时候,Xcode 仍然是在调用 GCC 命令。所以如果你很熟悉 UNIX 下的编 程,你完全可以不用 Xcode,在命令行编译 Cocoa 应用程序,也是很有乐趣的。

Xcode 功能强大,它支持软件生命周期的全部过程,一旦使用,你就会很难放弃它。事 实上,目前 Xcode 几乎成为了多数 Mac 开发者的唯一选择。非常开心的是 Xcode 是免费 的,只要你有一台 Mac,随机带的安装盘里就 有 Xcode,升级也是免费的,不过如果你用的 是 Mac OS 10.5 以前版本的 OS,你将不能运行 Xcode 3.0 或以上的版本,而我们恰恰推荐 你使用 Xcode3.0,所以要很好的选择你的 Mac OS X 的版本。

Xcode 编译用 C, C++, Objective-C, Objective-C++, 和 Java 编写的源代码工程。 它产生所有 Mac OS X 上支持的可执行代码类型,包括命令行工具,框架,插件,内核扩 展,包,和应用程序。 Xcode 允许几乎无限制的自定义编译和调试工具,执行代码打包(包括信息属性列表和本地化的包),编译过程(包括拷贝文件,脚本文件和其它编译阶段),以及用户界面(包括分开的,多视图的代码编辑器)。如果您的代码在一个 CVS 库里, Xcode 提供了源代码控制,允许您添加文件到库里,确定修改,获得更新的版本,以 及比较版本。图 3-9 展示了一个在 Xcode 里的工程的例子。

图 3-9 Xcode 中的 TextEdit 工程例子

Xcode 特别适合于 Cocoa 开发。在您创建一个工程的时候, Xcode 使用对应于 Cocoa 工程类型的工程模版为您设置一个起始的开发环境,工程类型有:应用程序( Objective-C 或者 Java ),基于文档的应用程序( Objective-C 或者 Java ),工 具,包,和框架。 Xcode 使用 GNU C 编译器( gcc )编译 Cocoa 软件,使用 GNU 源代码级别调试器( gdb )调试这些软件。 gcc 和 gdb 在 Cocoa 还是 NeXTSTEP (请参考 “历史简介”)的时候就被用于 Cocoa 的开发,经过若干年一直被精雕细琢,扩展,并且 调优以支持 Cocoa 二进制代码的编译和调试。 Xcode 还有一个类浏览的功能,您可以察看所有输入的 Cocoa 框架和任何您的自定义类,这些类按照它们继承关系排列;在类浏览器 里您可以请求任何类的文档。

要获得更多信息,请参考 Xcode 在苹果开发人员联盟网站( http://www.apple.com.cn/developer/ )上的 Xcode 主页,在那里您可以链接到 Xcode 最新的文档,这里就不再赘述了。