首页 苹果开发之Cocoa编程第4版

苹果开发之Cocoa编程第4版

举报
开通vip

苹果开发之Cocoa编程第4版 第 1章 Chapter 1 什么是 Cocoa 1.1 历史简介 Cocoa源于一段令人愉快的历史。很久以前,有两个叫 Steve的家伙,他们在车库中开 了一家名为 Apple Computer(苹果电脑)的公司。这家公司成长非常迅速,因此他们聘请 了一名很有经验的执行官 John Sculley来担任公司的 CEO。然而,在发生一系列矛盾冲突 之后,John Sculley居然使 Steve Jobs离开了苹果公司。Steve Jobs在离开苹果公司之后成立 了一家新的公司:NeXT Compute...

苹果开发之Cocoa编程第4版
第 1章 Chapter 1 什么是 Cocoa 1.1 历史简介 Cocoa源于一段令人愉快的历史。很久以前,有两个叫 Steve的家伙,他们在车库中开 了一家名为 Apple Computer(苹果电脑)的公司。这家公司成长非常迅速,因此他们聘请 了一名很有经验的执行官 John Sculley来担任公司的 CEO。然而,在发生一系列矛盾冲突 之后,John Sculley居然使 Steve Jobs离开了苹果公司。Steve Jobs在离开苹果公司之后成立 了一家新的公司:NeXT Computer。 NeXT公司聘请一些很有才华的工程师组建了一个小团队。这个小团队除了进行计算 机、操作系统、打印机以及一套开发工具的研发以外,还开了一家工厂。这些产品在那个 年代都很超前,并且令人兴奋和惊讶。遗憾的是,他们的计算机和打印机都没有很好的市 场。1993年,他们的工厂被迫关闭,NeXT电脑公司也变成了 NeXT软件公司。 在 NeXT软件公司里,操作系统和开发工具仍然采用 NeXTSTEP的品牌销售。虽然普 通的计算机用户很少听说过 NeXTSTEP,但是 NeXTSTEP在科研、投资银行和情报等领域 非常流行。并且有一些人一直在使用 NeXTSTEP开发应用程序,他们觉得相对于其他的技 术,NeXTSTEP能够更快地将想法变为现实。 这是怎样的一个操作系统呢? NeXT使用了 UNIX作为 NeXTSTEP的内核,采用了加 州大学伯克利分校开发的 BSD UNIX源代码。为什么选择 UNIX呢?这是因为相对于微软的 Windows或者苹果当时的操作系统,UNIX很少崩溃,并且能够提供强大可靠的网络功能。 苹果将这部分 UNIX源代码作为Mac OS X的底层基础,并将其命名为 Darwin。有一 个开源社区一直致力于提升 Darwin。读者可以通过访问 www.macosforge.org学习更多有关 Darwin的内容。 然后,NeXT为操作系统编写了一个窗口服务器。窗口服务器接收用户事件,并转发 给应用程序。于是,应用程序发送绘图命令给窗口服务器,让窗口服务器来刷新用户所见 的界面。NeXTSTEP窗口服务器一个极好的优点是发给窗口服务器的绘制代码和发给打 印机的一样,因此开发人员只需要编写一套绘制代码,便可同时用于屏幕显示和打印。在 2 苹果开发之 Cocoa编程 NeXTSTEP时代,开发人员编写生成 PostScript的代码,而在Mac OS X时代,开发人员 使用 Core Graphics(也就是 Quartz)框架的代码,Quartz可以在屏幕上合成这些图形,或 者把它们发送到打印机,或者生成 PDF(Portable Document Format)数据(PDF是一个由 Adobe公司制定的开放 协议 离婚协议模板下载合伙人协议 下载渠道分销协议免费下载敬业协议下载授课协议下载 ,用于矢量图形的存储)。 如果读者曾使用过 UNIX,那么可能会比较熟悉 X窗口服务器,Mac OS X的窗口服务 器与 X窗口服务器完全不同,但是它能完成与 X窗口服务器相同的功能:从用户那里接收 事件,并将事件转发给应用程序;将应用程序发来的数据显示在屏幕上。 NeXTSTEP内置了一套库和工具,让开发人员以一种优雅的方式与窗口管理器进行交 互。这些库也叫做框架,1993年,这些框架和工具被重新修改并重命名为 OpenStep,后来 重命名为 Cocoa。 如图 1-1所示,窗口服务器和应用程序都是 UNIX进程。 Cocoa可以让应用程序从窗口服务器接收事件,以及通过窗口 服务器在屏幕上绘图。 框 架 使 用 Objective-C语 言 开 发。 就 像 C++一 样, Objective-C语言是 C语言的一种扩展,因而具备面向对象的特 征。和 C++不同的是,Objective-C语言是一种弱类型语言,同 时也是极其强大的语言。Objective-C语言允许开发人员犯一些 低级错误。Objective-C语言是 C语言的简单扩充,它非常容易学习。 之所以开发人员喜欢 OpenStep,是因为 OpenStep可以让他们更容易地试验新想法。 实际上,Tim Berners-lee在 NeXTSTEP上开发了第一款网络浏览器和网络服务器。证券 分析员们可以用它们更快地开发和测试新的金融模块;大学生们可以用其开发他们的研 究程序。我不知道情报部门的人用 NeXTSTEP来做什么,但是情报部门购买了数千份 OpenStep。因为 OpenStep开发工具非常实用,所以它们被移植到 Solaris和Windows NT 上,而 NeXTSTEP操作系统也被移植到当时更流行的 CPU平台上,包括:Intel、Motorola、 Hewlett-Packard的 PA-RISC和 SPARC。(奇怪的是,直到 1999年,苹果在第一个版本的 Mac OS X服务器上—Rhapsody—才移植运行 OpenStep。) 许多年来,苹果公司致力于开发一个具有 NeXTSTEP大部分特性的操作系统,这就是 大家所熟知的 Copland 计划 项目进度计划表范例计划下载计划下载计划下载课程教学计划下载 。但 Copland项目逐渐失控了,因此苹果公司最终决定放弃开发, 转向从别的公司购买下一个版本的Mac OS。在调查了当时所有的操作系统之后,苹果公司选 择了 NeXTSTEP。因为 NeXT公司很小,所以苹果公司 1996年 12月收购了 NeXT公司。 NeXTSTEP变成了Mac OS X,仍然以 UNIX为内核。读者可以在Mac OS X上找到所 有的 标准 excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载 UNIX程序,例如 Apache Web Server。它非常稳定,并且用户界面也很吸引人。 2008年,苹果发布了 iOS SDK。苹果的应用商店也获得了不可思议的成功—带来了 数以百万计的 iOS开发者,其中大多都是Mac上的 Cocoa开发者。Cocoa Touch与 Cocoa 基础几乎完全一样,事实上两者的很多类都完全一样,更重要的是, 设计 领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计 模式及设计 规范 编程规范下载gsp规范下载钢格栅规范下载警徽规范下载建设厅规范下载 本质上没有进行改变。2010年,在Mac OS X Lion发布之前,苹果公司推出了Mac App 图 1-1 Cocoa是如何工作的 第 1章 什么是 Cocoa 3 Store,为Mac开发者发布应用带来了便利。 Cocoa框架使得开发者能以一种优雅、高效的方式编写个性化的应用程序,因此,读者 一定会爱上Mac OS X。 1.2 开发工具 读者也许不会马上就喜欢上 Cocoa。首先,读者需要学习基本知识。让我们从将用到的 开发工具开始吧。 Cocoa开发用到的所有工具都是Mac OS X Developer Tool的一部分,读者可以从Mac OS X安装盘中免费得到它们。虽然Mac OS X Developer Tool 将会在用户的操作系统中 添加许多有用的程序,但是用户主要使用一个程序:Xcode。后台可使用 LLVM(Low Level Virtual Machine)或 gcc(GNU C compiler)来编译代码,使用 LLDB(Low Level Debugger)或 gdb(GNU debugger)来查找错误。 Xcode追踪应用程序中所有用到的资源,包括代码、图片、声音等。开发人员在 Xcode中编写代码,由 Xcode编译和运行应用程序。Xcode也被用来调用和控制调试器。在 本书的练习中,强烈推荐使用 Xcode 4.2或更高版本。本书讲述的大多数示例可在 Xcode 3 或更早期的版本上运行,但 ARC内存管理却需要 Xcode 4.2版本的编译器。 在 Xcode中,Interface Builder是 GUI构建工具,它可以编辑 XIB文件,让开发者 进行窗口布局,并且将各个组件添加到窗口中,还能做更多的事情。开发者使用 Interface Builder创建各种对象并编辑它们的属性,这些对象大多数是用户界面元件(例如按钮和文 本输入框),但也可能是开发者自定义的对象。 开发者也可使用 Instruments来明确应用程序的 CPU、内存和文件系统使用情况,并 可进行内存管理的调试。Instruments使用 dtrace,使得创建新的 instruments成为可能。 1.3 编程语言 本书中所有的示例都使用 Objective-C语言来编写。Objective-C语言是 C语言一种简 单而优雅的扩充。如果读者已经熟悉 C语言和一门面向对象的语言(例如 C++或者 Java), 那么读者大概花费两个小时就能够掌握它。 使用 Ruby或者 Python也可以开发 Cocoa应用程序。本书不会包括这部分内容,如 果读者有兴趣,可以在网上找到大量资源。但要理解这些信息,读者仍然需要了解一些 Objective-C语言的工作原理。 在Mac OS 10.5中,Objective-C语言进行了较大的更改。本书中所有代码都是基于 Objective-C 2.0版本的,而且几乎所有的代码都使用 ARC进行内存管理。本书将在第 4章 讨论内存管理。 Objective-C代码由 LLVM编译器进行编译。该编译器允许开发者在单个文件中自由地 4 苹果开发之 Cocoa编程 组合 C、C++和 Objective-C代码。 gdb或 lldb调试器,用来设置断点、运行时查看程序中变量的值。Objective-C语言在 调试上给了开发人员很大的自由,你会乐意使用这样一个不错的调试器的。 1.4 对象、类、方法和消息 所有的 Cocoa编程都使用面向对象技术。本节将简单回顾一些面向对象的知识。如 果读者没有这方面的经验,那么建议去学习一下《The Objective-C Language》。读者可以 在苹果公司网站下载到 PDF版本的图书,URL是 http://developer.apple.com/library/mac/ documentaion/Cocoa/Conceptual/ObjectiveC/ObjC.pdf 什么是对象?对象就像 C语言中的结构:它占用内存空间来保存自己的变量。这些变 量称为成员变量。因此,在处理对象时,首先想到的问题是:怎样给一个对象分配空间? 这个对象拥有哪些成员变量?在处理完对象后,怎样释放它? 对象中的一些变量使用指针来指向其他的对象,这些指针帮助一个对象了解另一个对象。 类可以创建对象、指明对象拥有的变量和为对象分配内存。对象其实就是类的实例 (见图 1-2)。 图 1-2 类创建实例 对象优于结构的地方是它可以包含函数。我们把这些函数叫做方法。开发者可以给对 象发送一个消息来调用某个方法(见图 1-3)。 图 1-3 消息触发方法 1.5 框架 框架是一些被同时使用的类的集合。换句话说,这些类被一起编译成为一个可复用 类作为一个工厂 用于…… 发送一个消息…… 触发接收它的对象中的 方法 ……创建那个类 的实例 第 1章 什么是 Cocoa 5 的代码库。所有相关的资源放在库的目录中。该目录的扩展名为 .framework。你可以在 / System/Library/Frameworks找到系统内置的框架。Cocoa由以下 3个 framework组成。 1)Foundation:所有的面向对象语言都会有一些标准数值、集合和工具类。字符串、 日期、列表、线程和计时器都在 Foundation框架中。 2)Appkit:所有和用户界面相关的类都在 AppKit框架中。窗口、按钮、文本框、事件 以及画图类都包含在 AppKit中。它还有个名字:ApplicationKit。 3)Core Data:Core Data可以方便地把对象存储成文件或把对象从文件中加载到内存。 因此说 Core Data是一个持续性框架。 开发者主要关注上面 3个经常用的框架,掌握以后,其他框架也就非常容易理解了。 其他的框架包括加密、QuickTime、CD刻录等。 当然,也可以使用自己创建的类来创建框架。一般情况下,当某些类被多个应用程序 使用的时候,开发者就可能想把它们放到一个框架中。 1.6 如何阅读本书 本书是一本立足实践的指导性书籍,可帮助开发者全面理解 Cocoa编程。通常,书中 会先让你做些什么,然后再解析答案细节和理论基础。如果你感到困惑,请继续阅读后面 的内容。通常,答案就在接下来的一两段中。 假如开发者仍然感到困惑,可在 www.bignerdranch.com/books上寻找本书的在线帮助、 勘误表、提示和示例等,可以下载所有练习的答案。开发者也可以在 Big Nerd Ranch论坛 上(http://forums.bignerdranch.com/)进行提问或讨论书中的一些概念。 本书中的每一章将引导读者在应用上进行新内容的体验,但本书并不是一个“菜谱”, 其目的主要是传授思想,并通过练习来实现这些想法。不要害怕进行试验,这是一种有效 的学习方式。 Cocoa框架大概定义了 300个类。所有这些类的文档都可以通过在线帮助找到(使用 Xcode工具的 Help菜单访问)。Cocoa开发者会花费很多时间来浏览这些文档。可是面对这 么多的类文档,如果不对 Cocoa的整体有个大概了解,你很难找到想要的答案。当在书中 介绍到一个新类时,可以在在线帮助中浏览它,你无须理解浏览到的全部内容,但是这至 少会加深你对这个框架的认知。当结束本书的学习后,这些参考文档将成为你 Cocoa开发 的航标灯。 Cocoa程序开发符合这样的承诺:常用的是简单的,不常用的是可用的。如果你为一个 普通的功能写了很多行的代码,那你就可能走错方向了。 1.7 约定 在 Objective-C中,类名一般都大写开头,而方法的命名以小写字母开头。例如,你会 6 苹果开发之 Cocoa编程 看到这样的表达:类 NSObject中有一个 dealloc的方法。 其他的常量,如变量的命名,使用常规的字体表示即可,文件名也是一样的。例如: 类MyClass.m中设置变量 favoriteColor为 nil。 本书的代码示例采用常规的字体,而需要开发者自己增加的代码部分使用黑体。 1.8 常见错误 很多人都犯过这样的错误,甚至同一个错误出现过上百次。其中有两个错误是最容易 犯的:大小写错误和忘记连接。 之所以发生大小写错误是因为 C和 Objective-C都是大小写敏感的,Foo和 foo对于编 译器来说不是一回事儿。因此在编译上遇到问题时,请确认大小写正确。 当创建一个应用程序时,通常使用 Interface Builder来连接对象。虽然忘记进行连接不 会影响程序的编译和运行,但是会让程序产生莫名其妙的结果。因此,如果程序反应异常, 请返回检查一下 Interface Builder是否忘记了连接对象。 当你第一次编译一个文件时,很容易漏掉一些编译警告。而由于 Xcode是增量型编译 器,除非清除并重新编写项目,否则在下次编译时就看不到那些警告。所以,当出现一些 怪问题时,请尝试清除、重新编译。 1.9 如何学习 我教过各式各样的学生:聪明的,不聪明的;勤奋的,懒惰的;有经验的,没有经验的, 但是学习收获最多的同学都有一个共同的特质,那就是专注。 保证专注的第 1个诀窍就是足够的睡眠。建议当你准备学习一样新的东西时,每天晚上保 证 10个小时的睡眠。不信可以试试。当你醒来时一定会精力充沛。咖啡是不能代替睡眠的。 第 2个诀窍是要自信。当学习新东西时,很多学生经常这样想:“这个对我来说太难了 吧,我是不是太笨了?”愚钝在我们的认知里是非常可怕的。因此这些学生会花费很多时 间来辨析自己是否聪明。如果这样,你就不能专注了。 Rock,我以前的老板。他取得了加州理工学院的天体物理学位。可是他在后来的工作 中从来没有使用过相关知识。有一次我问他是否后悔去读这个学位。他说:“不,事实证 明我的学位是很有价值的,世界上确实有些很困难的事情。当我面对它们的时候可能会想 ‘这个对我来说太难了,我是不是够聪明?’可这时候我会想起我曾经获得过加州理工学院 的天体物理学位,我就有了信心。” 在开始学习之前,首先保证虽然会遇到一些困难的事情,但请相信自己一定不笨,一 定能够坚持下来。有了坚定的信心和充沛的精力武装自己,你就做好了征服 Cocoa的准备。 第 2章 Chapter 2 起  步 一般很多书会从一堆基本理论开始,不过在这里,这样做只会浪费宝贵的纸张。因此, 笔者打算先引导读者完成第一个 Cocoa应用程序。当完成它的时候,你一定是既激动又困 惑,这正是该学习理论的时候。 我们的第 1个项目是一个有两个按钮的随机数获取程序:根据时间获得随机数和产生 随机数,文本框用来显示所得到的随机数。这个简单的例子 包括了获得用户输入以及产生输出。本章中的讲解可能简单 了点。不过不要担心—后面会有更详细的展开说明。现 在,跟着来吧。 图 2-1是完整的程序运行后的样子。 2.1 Xcode 假如读者已安装了开发工具,就可以在 /Developer/Applications/中找到 Xcode。后面 会经常用到这个应用程序,所以把它拖到屏幕底部的 dock上。首先运行 Xcode。(假如读者 以前从没运行过 Xcode,那么首先看到的是欢迎界面,选择所有的默认值即可。) 正如前面提到的,Xcode将跟踪程序中用到的所有资源,这些资源被保存在 project directory目录中。开发新的应用程序的第一步是使用默认的选项创建一个项目目录。 2.1.1 新建项目 在菜单栏中单击 File→ New→ New Project,当出现如图 2-2所示的面板时,选择将 要创建的 Cocoa应用程序的项目类型(注意,这里还有许多其他类型的项目)。 本书主要讨论以下类型的项目: Application:创建窗口应用程序。 Tool:没有用户界面的程序。一般情况下是一个命令行程序或后台程序。 Bundle或 framework:可用于其他程序或工具中的资源目录。Bundle(有时也叫插件) 可在运行时动态加载。通常,应用程序在编译时需要链接到一个框架。 图 2-1 完成后的应用程序 8 苹果开发之 Cocoa编程 图 2-2 选择项目类型 输入 Random作为项目名,如图 2-3所示。应用程序名字一般都以大写字母开头。设 置类前缀为 Random,不选择 Create Document-Based Application、Use Core Data和 Include Unit Tests,确认 Use Automatic Reference Counting已勾选。本书中每个新项目 的创建都使用这种设置。 图 2-3 命名项目 接下来需要选择项目存储的目录。默认情况下,项目目录将创建在 home目录下。不选 择 Create local git repository。然后单击 Create按钮。 这样就创建了项目目录,里面包含了一个应用程序的基本框架。将这个基本框架扩展 到资源中,编译生成一个可工作的应用程序。 第 2章 起  步 9 在 Xcode中查看新的项目,将在窗口的左边部分看到一个提纲视图(outline view)。提 纲视图中的每一个条目都代表了项目中的一个文件。这是导航功能的项目框,其他的导航 框显示一些如编译器错误或查找结构之类的信息。这时,读者可处理编辑文件,将条目内 容与编译进应用程序的文件联系起来。 Xcode创建一个项目的基本框架,可进行编译和运行,它有一个菜单项和一个窗口。如 图 2-4所示,单击 Run工具条按钮,可创建和运行项目。 图 2-4 项目的基本框架 当应用程序运行时,可在 dock上看到一个跳跃的图标。应用程序的名字将出现在菜单 中—这意味着读者的应用程序是激活的。程序的窗口有可能被别的应用程序挡住。假如 看不到应用程序的窗口,可在 Random 菜单上选择 Hide Others。如图 2-5所示,就可以看 到一个空白的窗口。 图 2-5 运行项目 单击 10 苹果开发之 Cocoa编程 尽管这个应用程序不能做什么,但已经具备完整的功能了,甚至连打印功能也具备。 而在应用程序中仅有一行而已。退出 Random,返回到 Xcode。 2.1.2 main函数 展开 Supporting Files,选择 main.m,单击打开。编辑页面内出现如下代码(见图 2-6)。 如果双击文件名,将打开一个新的窗口。由于每天都处理很多文件,这可能让我们很快就 困在众多文件中。因此,这里使用了单窗口风格。 图 2-6 main()函数 在应用程序项目中几乎不用修改 main.m文件,默认的 main()函数简单调用 NSApplicationMain()函数,该函数加载和运行应用程序中的对象。在下一节中将学习 NSApplicationMain()函数怎么调用需要加载的对象。 2.2 Interface Builder 在 Random的项目导航页面中,可以找到一个名字为MainMenu.xib的文件,单击并在 interface Builder编辑器中打开它,然后,在工具条中单击 utility视图按钮,显示如图 2-7中 右侧的面板。 Interface Builder允许创建和编辑用户用作应用程序中的接口对象,如窗口和按钮。也 可以创建开发者定制的类的实例,并将实例与标准用户接口连接起来。当用户通过界面与 用户接口对象交互时,开发者创建的连接将执行代码。Interface Builder将对象和连接保存 到一个 XIB(读作“zib”)文件中。 第 2章 起  步 11 图 2-7 MainMenu.xib 2.2.1 utility区 utility区有两个面板:inspector面板和 library面板。inspector面板包含对选择文件或 Interface Builder对象的设置。library面板包含用于应用程序中的文件模板、snippet、对象 和工程中的多媒体资源。用户界面部件可以从对象库中拖到设计界面上。例如,如果需要 按钮,从对象库中拖出来就可以了。 2.2.2 空白窗口 在 Interface Builder中单击窗口按钮,出现的空白窗口表示一个 XIB文件中 NSWindow 类的实例(见图 2-8)。 当从 library中将选择的对象拖到窗口时,这些对象将被添加到 XIB文件中。当创建这 些对象实例并编辑属性时,保存 XIB文件就好像将这些对象存档到文件中。当 Random应 用程序运行时,NSRunApplication()将这些对象从 XIB文件中释放,赋予生命。更复杂的 应用程序可能会有多个需要加载的 XIB文件。 当应用程序加载对象完成后,就等着用户的动作了。当用户单击或输入字符时,程 序代码将自动进行调用。假如读者此前从未编写过图形用户界面的应用程序,这样的界 面交互将给你带来震撼,感觉好像用户掌控一切,不过这只是代码根据用户动作进行反 馈而已。 应用程序菜单 inspector面板 utility视图按钮 库 utility面板绘图区应用程序在 Interface Builder Dock中的窗口 12 苹果开发之 Cocoa编程 图 2-8 NSWindow 实例 更奇妙的 XIB文件和 NIB文件 XIB文件是一个使用 XML来表现用户接口对象和它们之间连接的文件。当生成应用 程序时,XIB文件将被编译进一个 NIB文件。XIB文件使用起来非常容易,特别是进行资 源控制。不过 NIB文件更小,更易于进行语法分析,因此,与应用程序一起发布的是 NIB 文件。通常,开发者只能操作 XIB文件,而生成的应用程序只能使用 NIB文件。但是大多 数开发者认为可交替使用 XIB和 NIB这两个单词。(另:NIB表示 NeXT Interface Builder, NS表示 NeXTSTEP。) 2.2.3 页面布局 下面将继续进行讲解,但请记住,你的目标是创建一个类似图 2-9所示的用户界面。 图 2-9 最终界面 在 library选择区中选择 Cocoa,将一个按钮从 library窗口拖到上面创建的空白窗口中, 如图 2-10。(为便于寻找,也可以在 Library面板的下拉菜单中选择 Cocoa→ Controls组, 或者在查找框中输入 button。) 双击按钮,改变其标题为 Seed random number generator using time。 复制和粘贴按钮,重新标记新按钮的标题为 Generate random number。然后再将一个 标签文本框拖到窗口中(见图 2-11)。 第 2章 起  步 13 图 2-10 拖曳一个菜单 图 2-11 拖曳一个文本框 拖动文本框的两边对齐,使文本框和按钮一样宽。(读者可能已经注意到,当拖动到接 近窗口边缘时,会出现蓝色的线条,这是为了遵循苹果公司的 GUI风格。) 可通过拖曳对象周围的透明手柄来使窗口变小一些。 为了将文本框文本居中,需要使用 Attributes Inspector。选择文本框,选择 inspector 面板顶部的 Attributes Inspector按钮,单击 center-justify按钮即可(见图 2-12)。 14 苹果开发之 Cocoa编程 图 2-12 文本框属性检查器 2.2.4 dock 在 XIB文件中,一些对象(如 button)是可见的,而其他的一些对象则是不可见的 (如开发者自己定义的控制对象)。那些不可见的对象的表示图标在 dock中。 dock包含表示主菜单和窗口的那些图标。First Responder就是一个虚拟的对象,但 却是个非常有用的虚拟对象,这在第 21章中详细解释。XIB中 File’s Owner是应用程序的 NSApplication对象。NSApplication对象从事件队列中取得事件,然后转发给相应的窗口。 在第 12章中详细讨论 File’s Owner的含义。 2.2.5 创建一个类 在 Objective-C中,每个类的定义由两个文件来完成:头文件和实现文件。头文件也叫 做接口文件,主要声明类中的成员变量和方法。实现文件则定义那些方法。 在 Xcode中,单击 File→ New→ New File菜单创建一个新的 Cocoa→ Objective-C类。 将类命名为 RandomController,将其设为 NSObject的一个子类,如图 2-13所示。 文件 RandomController.h和 RandomController.m将出现在项目中,假如没有出现在 Random组中(如图 2-14),可直接将它们拖曳过去。 在文件 RandomController.h中,可以为自己的类添加成员变量和方法。指向别的对象 的成员变量指针叫做 outlet。可被用户界面触发的方法叫做 action。 单击 center-justify按钮 第 2章 起  步 15 图 2-13 创建一个新类 图 2-14 Random Group中的 RandomController.h和 RandomController.m文件 编辑 RandomController.h文件,代码如下: � ������� � �<�� �!��������������� ��!��������<�� �!�C���� � � �� ������������ �������������� ����� ��� �������������� ��� �!���� ������������ ���� �������������� ����������������� ������������ ��� ���������� ���� ���� ����� ��������������������� ����� ��������������� ��� ���������� ���� ���� �8 ������������ ������������������������� " � � ���� �������� ��������� ����� �� � �� ������������� �������!�"#$�%�� �& ����'($� �� �"#)�� � ����* �� � ���+ , -�.'( � ��/����!. �/������+ -�.'( � ��/0����� �!. �/������+ ����� � .������������� ������3��������!!�����������!���� �����F � � ���������� �������� ��� ����� ����������� � � ���������� ��������� ������� ��������������"� �� � ����� ������������������� ���������������� ������ ������ � � ���������� ��������� �� ��!���� "��������� � ����� ��������������!���� � �7��������������������!� ����!���� ��� ��� �������������� � ����� ������ ���� �������� �����������!�� ��� ����!�������� �� ����8���� ���������� � �� ������������� ������� ���������5� &�������!����� ���� ��������#� �������������������� ���!� � ����� ������������������ &�������!�������������� ������� �6������������� ��������� � ������������ ����� � 1��������� ���������������� ���������������� ���������� ���������������*�7�������6�������� ������� �������������������������7��� ����'��!�����,������������� �����������)���� �-�� ��������� *�)���� ��.���� �������0���� � ��������������������������7��� ��� ����-'������(�);0� � ������� �! �$��������� �����������������������7��� ��� ���� � � 16 苹果开发之 Cocoa编程 从这个文件,一名 Objective-C程序员可以得出以下信息: 1)RandomController是 NSObject的一个子类。 2)RandomController有一个成员变量,它是一个指向 NSTextField对象的指针。 3)RandomController有两个方法:seed:和 generate:,它们都是 action方法。 依据编程规范,方法和成员变量的命名都是以小写字母开头的。假如一个名字由多 个英文单词组成,那么除第一个字母小写以外,后面遇到的单词首字母都要大写(如 favoriteColor)。当然,依据规范,类名以大写字母开头(如 RandomController)。 保存 RandomController.h文件。 2.2.6 创建一个实例 下面将在 XIB文件中创建一个类 RandomController的实例。选择MainMenu.xib文 件,返回 Interface Builder。从 library面板拖曳一个蓝色的图标(在 Cocoa→ Objects & Controllers中),把它放到 Interface Builder dock上(如图 2-15)。 图 2-15 拖曳一个对象到 Interface Builder dock 在 Identity Inspector中,设置类为 RandomController(见 图 2-16)。(action和 outlet将出现在 Connection查看器中, 假如没有出现,检查 RandomController.h文件,一定是有错 误或者文件还没有存储。) 2.2.7 创建连接 许多面向对象的编程语言必须让一个对象知道另一个对 象。现在就将一个对象介绍给另一个对象 Cocoa程序员可能会 图 2-16 设置类 Identity 第 2章 起  步 17 说:“我们将要设置对象的 outlet。”为将一个对象介绍给另一个对象,需要使用控制拖曳, 将对象 A拖曳到另一个对象 B。图 2-17描述了示例中的对象连接关系。 图 2-17 对象图 将设置 RandomController的文本框变量指向窗口中的 NSTextField对象。右键单击(假如 使用单键鼠标,则使用 Control+单击)代表对象 RandomController实例的图标。Connection面 板将出现。将 textField旁边的圈拖曳到显示 Label的文本区域(如图 2-18所示)。 图 2-18 设置 textField的 outlet 这一步主要建立指针:必须在 RandomController对象中设置指向文本框的指针 textField。 现在设置 Seed按钮的目标 outlet,让它指向 RandomController的实例。此外,还 希望按钮来触发 RandomController类的 seed:方法。使用控制拖曳,将按钮拖曳到 RandomController类的实例。当面板出现时,选择 seed:(见图 2-19)。 18 苹果开发之 Cocoa编程 图 2-19 设置 Seed按钮的 Target和 Action 同样地,设置按钮 Generate的目标 outlet来指向 RandomController类的实例,并设 置它的 action为 generate:方法。将按钮拖曳到 RandomController类的实例。当面板出现 时,选择 generate:(见图 2-20)。 图 2-20 设置 Generate按钮的 Target和 Action 2.3 回顾 Objective-C 假如读者是第一次看到 Objective-C代码,可能会担心它看上去与 C++或 Java完全不 同。不过,语法或许不同,但基本概念是一样的。例如,Java中的一个类可以声明如下: ������ �� �������� ����!��������������� �������� ������3���� �������!����������!� ���� � ������������������ �=����� ������������!��GG����/������ ������� ����� !������ �������������������� ��������������� ��������� �!���'������!���������� ����/���� ��� ���� ������ ��������� " � ���� �������0������(��+ ���� �������0������(�1+ ���� �������������� �����(��� ������� ��(�1�& ����� ��������� �� �������� �������� , � ��� � �� ��@������� ������������ ����!�������� �!����� ��!���!��� �����!���� � ������ ��������!�"�����������A ������������� ���� ������ ������3�� ��� ���� ������ ��������� " � � ���� ����0������(����� � ���� ����0������(�1��� � � �� ��������!�(����(�1��& ��� �� �������� �������� , ����� ������� ���� � ��� ���� ��� � /����� �� ������3�� ������� � �%�� �� �������� 1���� ����� ����� /����� �� ������3�� ���� � ����� ������ �����������9� ����� � �� �� ��� � �� � ����� ��� ������� � � "*�� �������� ���� ����15�����6�7� � �� ������3��������!!�� �� ������ ����� ������������������ ���������� ����������� ��� � � H� ��� ���������������������������� ���� � H�($$2�� ����� �!��� ����������� �� � �� ���7������������� � H�34#�� �)� � H�"$�� �E� � H�'($� �� �� ���!������������������ ������������������������-'($� �� �� ���������������������7��� ��� ���������� ����� ������������������� ����!����� �����0 � H�'( � ���� ����� �!��� ��� �������� ����� �� ���������������������7��� ��� � H�� ��� ����� �!��� �"522��.��� ��� ���� ��� ����"522������������ ������ ��� � � ���,��������8��������'� � ������������������ ����������6�� �����������!�!�������� ������ ���������� ��������������� ����� ����������� ���� �������������� ����� ������ ��� � � ��������� � � � ���� �������� ��������� ����� � � �� ������������� �������!�"#$�%�� & ���'($� �� �"#)�� � ����* �� � ���+ , -�.'( � ��/0����� �!. �/������+ -�.'( � ��/����!. �/������+ ���� � � ���� � � � �!����� ��� ���� �� �������� ��% �� �������� I� ������� ���� � �� ��� � ����� ���� ����� � � ����� � � ����� ������ +��� ���� �!��������������� ��� ������ ����������� ������������ � ����� ��������������������� �� ������ ����� ������� ������������� ������� �1������������� ��������������������� � ���� � ����� � �� ����������� �!����� ������ � ����������������!!�����������������!���!�5���������� ���� ����� �� �� �� � �� ������3�� �� ��� �� ������3�� ��� �� � ���� ������� � ������ I���� ���� �� �� � ������ �� ������3�� ��� �� "������� � ������� � ���� ������� ������ �������� ����6�������� 76�������7� ��� 1�� � 9���������#�'�#�����������'� � 1� � ����� ������������ ���������� ��� ������� � ���� �!���!�������� � ��� ���� !���� �� +��� ���� ��� � ��� ��� ���� ��� ���� ����������� ��� ���� ���� � �� *�� �% ��-��� �� *�/ �� ����� ��� � ����� ���!!�� ���������3��!!�� 3��#��� �� ��������� ������ �������� ��������� ��� ������� �� �������� ��+������ �� ������������������ �� �0�� ������������������� ���������!��������� �� ������������������������� ������ �������� � ����� �����GG����/���������!������!���!������!���� � �!��������������� " � ���� ���� �� ������� .$�%�� �������/�& 这段代码的意思是:“类 Rex继承自类 Bar,实现在 Baz接口文件中声明的方法。” 第 2章 起  步 19 Objective-C相似的声明方法如下: ������ �� �������� ����!��������������� �������� ������3���� �������!����������!� ���� � ������������������ �=����� ������������!��GG����/������ ������� ����� !������ �������������������� ��������������� ��������� �!���'������!���������� ����/���� ��� ���� ������ ��������� " � ���� �������0������(��+ ���� �������0������(�1+ ���� �������������� �����(��� ������� ��(�1�& ����� ��������� �� �������� �������� , � ��� � �� ��@������� ������������ ����!�������� �!����� ��!���!��� �����!���� � ������ ��������!�"�����������A ������������� ���� ������ ������3�� ��� ���� ������ ��������� " � � ���� ����0������(����� � ���� ����0������(�1��� � � �� ��������!�(����(�1��& ��� �� �������� �������� , ����� ������� ���� � ��� ���� ��� � /����� �� ������3�� ������� � �%�� �� �������� 1���� ����� ����� /����� �� ������3�� ���� � ����� ������ �����������9� ����� � �� �� ��� � �� � ����� ��� ������� � � "*�� �������� ���� ����15�����6�7� � �� ������3��������!!�� �� ������ ����� ������������������ ���������� ����������� ��� � � H� ��� ���������������������������� ���� � H�($$2�� ����� �!��� ����������� �� � �� ���7������������� � H�34#�� �)� � H�"$�� �E� � H�'($� �� �� ���!������������������ ������������������������-'($� �� �� ���������������������7��� ��� ���������� ����� ������������������� ����!����� �����0 � H�'( � ���� ����� �!��� ��� �������� ����� �� ���������������������7��� ��� � H�� ��� ����� �!��� �"522��.��� ��� ���� ��� ����"522������������ ������ ��� � � ���,��������8��������'� � ������������������ ����������6�� �����������!�!�������� ������ ���������� ��������������� ����� ����������� ���� �������������� ����� ������ ��� � � ��������� � � � ���� �������� ��������� ����� � � �� ������������� �������!�"#$�%�� & ���'($� �� �"#)�� � ����* �� � ���+ , -�.'( � ��/0����� �!. �/������+ -�.'( � ��/����!. �/������+ ���� � � ���� � � � �!����� ��� ���� �� �������� ��% �� �������� I� ������� ���� � �� ��� � ����� ���� ����� � � ����� � � ����� ������ +��� ���� �!��������������� ��� ������ ����������� ������������ � ����� ��������������������� �� ��
本文档为【苹果开发之Cocoa编程第4版】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_547258
暂无简介~
格式:pdf
大小:6MB
软件:PDF阅读器
页数:49
分类:互联网
上传时间:2013-06-27
浏览量:214