iOS7:iPhone/iPad应用开发技术详解
上QQ阅读APP看书,第一时间看更新

第1章 初识iOS、Objective-C和Xcode

“问渠哪得清如许,为有源头活水来。”如果要开发iPhone/iPad应用程序,就不得不探究其源头——iOS和Objective-C。本章将从整体的角度介绍iOS架构和常用框架,使你对基于iPhone/iPad的应用开发,从整体轮廓上有一个清新的认识。由于iOS架构为开发iPhone和iPad应用提供了丰富而强大的功能,因此,了解架构里不同功能的框架是十分重要的。在介绍iOS之余,初步认识一下Objective-C;最后介绍如何搭建iPhone/iPad开发环境。

1.1 认识iOS

iOS是由苹果公司(以下简称“苹果”)开发的手持设备操作系统。苹果公司在2007年1月9日的MacWorld大会上公布这个系统,随后于同年的6月发布了第一版iOS操作系统,当初此操作系统的名称为“iPhone runs OS X”。最初设计是供iPhone使用的,后来陆续套用到iPod touch、iPad以及Apple TV等苹果产品上。就像其基于的Mac OS X操作系统一样,它也是以Darwin为基础的。系统操作占用约240MB的内存空间。

1.1.1 iOS的发展历程

iOS经过不断发展和完善,逐步被人们熟悉和接受。最初,由于没有人了解iPhone runs OS X的潜在价值和发展前景,导致没有一家软件公司、没有一个软件开发者为iPhone runs OS X开发软件或者提供软件支持。于是,苹果公司时任CEO斯蒂夫·乔布斯说服各大软件公司以及开发者可以先搭建低成本的网络应用程序(Web APP),使得它们能像iPhone的本地化程序一样测试iPhone runs OS X平台。

2007年1月,苹果发布了iPhone OS 1.0。该版本支持多点触控、虚拟键盘输入、邮件发送等功能。

2008年7月,苹果发布了iPhone OS 2.0。版本2.0比1.0增加了很多新的功能。例如加入了App Store、支持手写输入、正式支持中文、支持Office文档、截图功能和计算器等。

2009年6月,苹果发布了iPhone OS 3.0。版本3.0比2.0增加了100多种功能,例如人们期待的剪切、复制、粘贴、蓝牙等,以及手机横向键盘、彩信、P2P连接等功能吸引了大量的用户。

2010年6月,苹果发布其第四代iPhone操作系统。由于获得了思科iOS的名称授权,从2010年起,iPhone OS正式更名为iOS,该版本为iOS 4。相比以前的版本,iOS 4有多任务处理、程序文件夹E-mail功能增强、企业级应用、游戏中心、广告嵌入和无分类邮箱等七大改进,尤其是多任务处理,弥补了苹果长期以来的痛处。

2011年6月,苹果发布了iOS 5。相比iOS 4,新版本增加了联系人黑名单,同时把Twitter和Siri也整合到了该系统。Siri是基于Nuance的语音识别技术,它不是苹果土生土长的服务,而是苹果2010年4月通过收购所得的。从此版本起,iOS开始了增加第三方应用。

2012年6月,苹果公司在WWDC 2012大会上公布了全新的iOS 6操作系统。iOS 6可算是苹果首次对深度整合的实施,Facebook、新浪微博、百度搜索、视频等第三方应用也不断整合到新的版本中。

2013年6月10日,苹果公司在WWCD 2013大会发布了全新iOS 7操作系统。iOS 7完全抛弃了以前的风格,重新设计了拨号、天气、日历、短信等应用的交互界面,整体透露出简洁、动感、时尚之感。图1-1为苹果公司最新发布的iOS 7界面。

图1-1 iOS 7界面

1.1.2 iOS的设计和功能特性

iOS是一款优秀、先进的移动操作系统,具有简单易用的界面、令人惊叹的功能,以及超强的稳定性,已经成为iPhone、iPad和iPod touch的强大基础。尽管其他竞争对手一直努力地追赶,但iOS内置的众多技术和功能让Apple设备始终保持着遥遥领先的地位。

总结iOS设计和功能特性,有以下几点。

1.优雅直观的界面

第一次上手,你就会知道怎样使用你的iPhone、iPad和iPod touch,如图1-2所示。因为iOS中极具创新的Multi-Touch界面专为手指而设计。

前所未有的轻松体验从简洁美观的主屏幕开始。从内置App到App Store提供的700000多款App和游戏,从进行FaceTime视频通话,到用iMovie剪辑视频,你所触及的一切,无不简单、直观、充满乐趣。

图1-2 基于iOS的产品

2.精彩功能与内置App

iOS不断丰富的功能和内置App,让iPhone、iPad和iPod touch比以往更强大、更具创新精神,使用起来乐趣无穷。

3.软硬件搭配如天作之合

由于Apple同时制造iPad、iPhone和iPod touch的硬件和操作系统,因此一切都配合得天衣无缝。这种高度整合使App得以充分利用Retina显示屏、Multi-Touch界面、加速感应器、三轴陀螺仪、加速图形功能以及更多硬件功能。FaceTime就是一个绝佳典范,它使用前后两个摄像头,具有显示屏、麦克风和WLAN网络连接。

4.世界级庞大的智能App集合

iOS平台拥有数量庞大的移动App,几乎每类App都有数千款,而且每款App都天生出色。这是因为Apple为第三方开发者提供了丰富的工具和API,从而让他们设计的App能充分利用每部iOS设备蕴含的先进技术。所有App都集中在一处,只要使用你的Apple ID,即可轻松访问、搜索和购买这些App。你需要做的,只是在设备上访问App Store,然后轻点下载。

5.轻松更新

iOS可以免费更新。有更新发布后,你可以通过无线方式将其下载到iPhone、iPad或iPod touch上。设备甚至可以适时提醒你下载最新的版本,使你不会错过最近更新的所有精彩功能。

6.安全可靠的设计

从你打开设备的那一刻起,iOS就开始为你提供内置的安全性。我们专门设计的低层级的硬件和固件功能,用以防止恶意软件和病毒;同时还提供高层级的OS功能,在访问个人信息和企业数据时确保安全性。

为了保护用户的隐私,从日历、通讯录、提醒事项和照片获取位置信息的App必须先获得用户的许可。用户可以设置密码锁,以防止有人未经授权访问自己的设备,还可以进行相关配置,允许设备在多次尝试输入密码失败后删除所有数据。该密码还会为用户存储的邮件自动加密和提供保护,并能允许第三方App为其存储的数据加密。iOS支持加密网络通信,用于保护App传输过程中的敏感信息。如果设备丢失或失窃,可以利用“查找我的iPhone”功能在地图上定位设备,并远程擦除所有数据。一旦iPhone失而复得,还能恢复上一次备份的全部数据。

7.内置辅助功能

引导式访问、VoiceOver和AssistiveTouch功能,让更多的人可以体验iOS设备的迷人之处。比如,凭借内置的VoiceOver屏幕阅读技术,视力不佳的人可以听到其手指在屏幕上触摸到的项目说明。iOS开箱即可支持30多种无线盲文显示屏,还能提供许多备受赞誉的辅助功能,如动态屏幕放大、隐藏式字幕视频播放、单声道音频、黑底白字显示等。

8.世界通用

iOS设备可在世界各地通用。30多种语言供你挑选,可以在各种语言之间轻松切换。iOS键盘基于软件而设计,有50多种支持特定语言功能的不同版式供你选择,其中包括字符的变音符和日文关联字符选项。此外,内置词典支持50多种语言,VoiceOver可阅读超过35种语言的屏幕内容,语音控制功能可读懂20多种语言。

9.适合不同阶层人士使用

对于商务使用,全球的企业都开始选用iOS设备,因为它具有企业专属功能和高度的安全性。iOS兼容Microsoft Exchange和标准服务器,可发送无线推送的电子邮件、日历和通讯录。iOS在传输、设备内等待和iTunes备份三个不同阶段为信息分别加密,确保数据安全。用户可以安全地通过业界标准VPN协议接入私人企业网络,公司也可以使用配置文件轻松地在企业内部署iPhone。

对于学习之用,有了iOS,iPhone、iPad和iPod touch即可变为出色的学习工具。用户可使用日历来追踪所有的课程和活动,提醒自己准时赴约并参加小组学习,还可利用备忘录App随手记下清单内容,或将好想法写下来。借助内置WLAN功能在网上进行研究或撰写电子邮件,甚至还可以添加照片或文件附件;使用语音备忘录功能录制采访、朗读示例、学习指南或课堂讲座。无论是单词定义、练习法语词汇,还是查找腰脊柱的位置,都能在App Store找到相应的App。

1.1.3 iOS 7的新特性

iOS 7是苹果公司推出最新一代的iOS操作系统,图1-3列出了iOS 7的新特性。

图1-3 iOS 7新特性

iOS 7最大的改进在于重新设计的UI界面更加小清新,更加绚丽。此外还借鉴了Android操作系统的诸多优势,使iOS 7更加接地气、人性化。全新的界面设计彻底颠覆了延续近6年的“乔帮主风格”,让人眼前一亮,苹果称其为iOS诞生以来最大的一次改变。iOS 7中去掉了诸多拟物设计,而是采用更加简约,更加扁平化的图标设计。

除了界面图标改变之外,iOS 7的新增功能也不少,例如多任务处理、共享处理和车载等功能。多任务处理始终是在App之间切换的捷径。现在,它变得更加智能。因为iOS 7会了解个人喜欢何时使用App,并在个人启动App之前更新个人的内容。iOS 7共享处理主要依赖于AirDrop,通过文本消息或电子邮件发送照片或文档是没问题的。但如果某人就在旁边,文本消息或电子邮件会让人感觉大费周章。AirDrop能快速、轻松地共享照片、视频、通讯录,以及任何App中的一切。只需轻点共享按钮,然后选择共享对象即可。AirDrop使用无线网络和蓝牙,无须设置,而且传输经过加密,可严格保障共享内容的安全。车载iOS将个人的iOS设备,与个人的仪表盘系统无缝结合。如果个人的汽车配备车载iOS,个人就能连接iPhone 5,并使用汽车的内置显示屏和控制键或Siri免视功能与之互动。现在,个人可以轻松、安全地拨打电话、听音乐、收发信息、使用导航,以及更多。所有的设计,都为了让iPhone专注于个人的需求,让司机可以专注于个人的驾驶。

iOS 7对此前的“找回iPhone”功能进行了补充;内置了一款图片管理软件,支持众多滤镜效果,还可以用多种方式来浏览图片。

1.1.4 iOS架构

iOS架构和Mac OS的基础架构相似。站在高级层次来看,iOS扮演底层硬件和应用程序(显示在屏幕上的应用程序)的中介,如图1-4所示。用户创建的应用程序不能直接访问硬件,而需要和系统接口进行交互。系统接口转而又去和适当的驱动打交道。这样的抽象可以防止应用程序改变底层硬件。

图1-4 应用程序位于iOS上层

注意 虽然应用程序通常会和底层硬件隔离,但是应用程序代码仍需考虑设备之间的某些差异。举个例子,iPad和iPod touch不能打开包含电话号码的URL,但是iPhone却可以。

iOS实现可以看做多个层的集合,底层为所有应用程序提供基础服务,高层则包含一些复杂的服务和技术。图1-5为iOS架构层次。

图1-5 iOS架构层次

1.Cocoa Touch层

Cocoa Touch层包含创建iOS应用程序所需的关键框架。上至实现应用程序可视界面,下至与高级系统服务交互,都需要该层技术提供底层基础。在开发应用程序的时候,尽可能不要使用更底层的框架,尽可能使用该层的框架。Cocoa Touch层支持多任务、数据保护、推送通知服务、本地通知和手势识别器等高级特性。

2.Media层

Media层包含图形技术、音频技术和视频技术,这些技术相互结合就可为移动设备带来最好的多媒体体验,更重要的是,它们让创建外观音效俱佳的应用程序变得更加容易。可以使用iOS的高级框架更快速地创建高级的图形和动画,也可以通过底层框架访问必要的工具,从而以某种特定的方式完成某种任务。

3.Core Services层

Core Services层为所有的应用程序提供基础系统服务。可能应用程序并不直接使用这些服务,但它们是系统很多部分赖以建构的基础。

4.Core OS层

Core OS层的底层功能是很多其他技术的构建基础。通常情况下,这些功能不会直接应用于应用程序,而是应用于其他框架。但是,在直接处理安全事务或和某个外设通信的时候,必须要应用到该层的框架。

注意 在编写代码的时候,应该尽可能地使用高层框架,而不要使用底层框架。高层框架为底层构造提供面向对象的抽象。这些抽象可以减少需编写的代码行数,同时还对诸如Socket和线程这些复杂功能进行封装,从而让编写代码变得更加容易。虽说高层框架是对底层构造进行抽象,但是它并没有把底层技术屏蔽起来。如果高层框架没有为底层框架的某些功能提供接口,开发者可以直接使用底层框架。

1.1.5 iOS框架

应用程序由代码和Apple提供的框架组成,其关系如图1-6所示。框架包含了框架资源库供应用程序调用,多个应用程序可同时访问一个框架资源库。开发的应用程序都会链接多种框架,并通过框架的应用编程接口(API)来利用框架。API(已发布在头文件中)指定可用的类、数据结构和协议。Apple编写的框架,预计可能想要实现的基本功能。使用框架既省时省力,又可确保代码高效、安全。系统框架是访问底层硬件的唯一途径。

图1-6 代码、框架和应用程序之间的关系

框架是一个目录,包含了共享资源库,用于访问该资源库中储存的代码的头文件,以及图像、声音文件等其他资源。共享资源库定义应用程序可以调用的函数和方法。

iOS提供了许多可在应用程序开发中使用的框架。要使用一个框架,需要将它添加到项目,以便应用程序可以链接到它。大多数应用程序都链接到Foundation、UIKit和Core Graphics框架。根据用户为应用程序选取的模板,可能也包括其他框架。如果一组核心框架无法满足应用程序的要求,用户总是可以将其他框架添加到项目。

iOS架构中包含了大量应用于不同领域的框架。对于Foundation、UIKit、Core Data、Core Graphics、Core Animation和OpenGL ES等常用框架,将会在本节中做简单介绍。其中Foundation和UIKit框架,能满足大多数应用程序开发的需求,但是在实际的应用程序开发中,还要用到很多高级技术,这就要求我们对于Core Data、Core Graphics、Core Animation和OpenGL ES框架也要熟练掌握,以便于在开发应用程序中使用这些框架提供的高级技术。

1.Foundation框架

Foundation框架为所有应用程序提供基本的系统服务。应用程序以及UIKit和其他框架,都建立在Foundation框架的基础结构之上。

Foundation框架提供许多基本的对象类和数据类型,使其成为应用程序开发的基础。它还制定了一些约定(用于取消分配等任务),使代码更加一致,可再用性更好。

Foundation框架的功能如下:

·创建和管理集,如数组和字典;

·访问储存在应用程序中的图像和其他资源;

·创建和管理字符串;

·发布和观察通知;

·创建日期和时间对象;

·自动发现IP网络上的设备;

·操控URL流;

·异步执行代码。

通过以上简单介绍可以知道Foundation框架的重要性,后面的章节会专门进行详细介绍。

2.UIKit框架

UIKit框架提供的类可用于创建基于触摸的用户界面。所有iOS应用程序都基于UIKit。没有这个框架,就无法交付应用程序。

UIKit提供基础结构用于在屏幕上绘图、处理事件,以及创建通用用户界面元素。UIKit还通过管理屏幕上显示的内容来组织复杂的应用程序。

UIKit框架的功能如下:

·构建和管理用户界面;

·处理基于触摸和运动的事件;

·显示文本和网页内容;

·优化应用程序以实现多任务;

·创建自定用户界面元素。

UIKit框架提供了大量用于设计用户界面交互的常用控件,它封装的类是开发可视化应用程序不可缺少的,对于入门者来说,掌握UIKit是快速掌握iOS应用程序开发的捷径之一。后面的章节将会专门详细介绍UIKit框架提供的一些常用类的用法。

3.Core Data框架

Core Data框架用于管理应用程序的数据模型。借助Core Data,可以创建模型对象(称为被管理的对象),管理那些对象之间的关系,并通过框架更改数据。Core Data利用内建的SQLite技术高效地储存和管理数据。

Core Data框架的功能如下:

·存储对象和从储存处取回对象;

·支持基本的撤销/重做;

·自动验证属性值;

·对内存中的数据进行过滤、分组和整理;

·使用NSFetchedResultsController管理表格视图中的结果;

·支持基于文稿的应用程序。

4.Core Graphics框架

高质量的图形,是所有iOS应用程序的一个重要组成部分。使用Core Graphics框架可以创建图形。在iOS中创建图形最简易、便捷的方法,是将预渲染的图像与UIKit框架的标准视图和控制配合使用,并让iOS完成绘图。

由于UIKit提供用于自定绘图的类,包括路径、颜色、图案、渐变、图像、文本和变换,因此建议尽可能地使用UIKit(较高级的框架),而非Core Graphics(较低级的框架)。

编写在iOS和OS X之间直接共享的绘图代码时,需要使用Core Graphics。Core Graphics框架也称为Quartz,它在这两个平台上几乎相同。

Core Graphics框架的功能如下:

·制作基于路径的绘图;

·使用边缘模糊化渲染;

·添加渐变、图像和颜色;

·使用坐标空间变换;

·创建、显示和解析PDF文稿。

5.Core Animation框架

使用Core Animation框架可以制作高级动画和视觉效果。UIKit提供的动画是建立在Core Animation技术之上的。如果需要超出UIKit功能的高级动画,可以直接使用Core Animation。

借助Core Animation能够创建不同层次的层对象,并对它们进行操控、旋转、缩放、变换等。通过使用大家所熟悉的Core Animation视图式抽象,可以创建动态用户界面,而无须使用低级的图形API,如OpenGL ES等。

Core Animation框架的功能如下:

·创建自定动画;

·给图形添加时序功能;

·支持关键帧动画;

·指定图形布局约束;

·将多层更改分组为原子更新。

6.OpenGL ES框架

OpenGL ES框架提供2D和3D绘图工具,支持基础的2D和3D绘图。Apple实施的OpenGL ES标准与设备硬件紧密协作,为全屏幕游戏类应用程序提供很高的帧速率。

OpenGL ES框架的功能如下:

·创建2D和3D图形;

·制作更复杂的图形,如数据可视化、飞行模拟或视频游戏;

·访问底层图形硬件。

1.1.6 iOS系统框架的变迁

iOS系统包含的框架为编写iOS平台的软件提供必要的接口。表1-1列出了框架中的类、方法、函数、类型以及常量使用的关键前缀,请避免在符号名称中使用这些前缀。描述iOS设备提供的框架位于<Xcode>/Platforms/iPhoneOS.platform/Developer/SDKs/<iOS_SDK>/System/Library/Frameworks目录。路径中的<Xcode>表示Xcode的安装目录,<iOS_SDK>表示目标SDK版本。表中“最先引入iOS版本”的列表示首次引入相关框架的iOS系统版本。

表1-1 系统中的框架

(续)

(续)

1.1.7 Mac OS X和iOS平台不同框架的差异性

虽然iOS的大多数框架同样存在于Mac OS X系统中,但不同平台框架具有不同的实现方式和使用方式。本节收集了一些开发iOS应用程序需要注意的重要差别。

1.UIKit框架与AppKit框架的差异性

在iOS系统中,创建图形应用程序、管理事件循环以及执行其他界面相关的任务都离不开UIKit提供的基础结构。UIKit和AppKit具有非常显著的区别,在设计iOS应用程序的时候,应该特别注意这一点。也正是这个原因,在将Cocoa应用程序迁移到iOS系统的时候,必须提供和界面相关的类和逻辑。表1-2列出了框架之间的差异,可帮助你理解iOS中的应用程序应该具有什么特征。

表1-2 UIKit框架与AppKit框架的差异性比较

(续)

2.Foundation框架的差异性

Mac OS X和iOS都有Foundation框架,大多数所预期的类都可以在该框架中找到。两个平台的框架都支持数值管理、字符串、集合、线程,以及许多其他常见的数据类型。表1-3列出一些不包含于iOS框架的重要功能以及相关类不存在的缘由,同时尽量列出有哪些技术可作为替代。

表1-3 Mac OS X和iOS在Foundation框架的比较

iOS系统的Foundation框架提供对XML的支持,可以通过NSXMLParser类解析XML文件,其他解析类(包括NSXMLDocument、NSXMLNode)不被支持。除了NSXMLParser之外,还可以使用libXML2库,这是C语言的XML解析接口。

3.其他框架的差异性

Mac OS和iOS系统中的其他框架的差异如表1-4所示。

表1-4 同时存在于iOS和Mac OS X的框架之间的差异

1.1.8 初步了解iOS开发者工具

如果希望在iOS系统中开发应用程序,需要配备一台运行Xcode工具的Mac OS X计算机。Xcode是苹果公司的开发工具套件,可用于管理工程、编辑代码、构建可执行文件,还可进行源码级调试、源代码仓库管理、性能调节等。套件的核心是Xcode应用程序本身,它用于提供基本的源代码开发环境。但是Xcode并非唯一可以使用的工具,下面将介绍开发iOS软件使用的一些工具。

1.Xcode

Xcode是一个集成开发环境(IDE),可以用于创建及管理iOS工程和源文件、将源代码链编程为可执行文件,并在设备运行代码,或者在iPhone模拟器上调试代码所需的各种工具。总之,Xcode将一系列功能整合在一起,让iOS应用程序开发变得更加容易,其提供的具体功能如下。

·对软件产品进行定义的工程管理系统。

·代码编辑环境(包括为文法显示不同颜色、代码补全以及符号指示等多种功能)。

·高级文档阅读工具(用于阅读搜索苹果文档)。

·对上下文敏感的检查工具(用于查看选定代码符号的信息)。

·高级链编系统(具有依赖检查及链编规则计算功能)。

·GCC编译器(支持对C、C++、Objective-C、Objective-C++、Objective-C 2.0及其他语言进行编译)。

·集成源码级的调试功能(此功能使用GDB来实现)。

·分布式计算(此功能可以将巨大的工程分布到数台联网的机器上运行)。

·预测编译(此功能可以加速单个文件的编译周转时间)。

·高级调试功能(例如停顿和继续运行,而且可以定制数据格式化方式)。

·高级重构工具(这些工具可以在不改变整体行为的前提下对代码进行全局性的修改)。

·工程快照的支持(工程快照是一种轻量级的本地源代码管理形式)。

·支持启动性能工具对软件进行分析。

·支持源代码管理集成。

·支持使用AppleScript实现链编过程自动化。

·可以生成DWARF和Stabs调试信息(所有的新工程都会默认生成DWARF调试信息)。

创建一个新的iOS应用程序,需先在Xcode中创建一个新的工程。所有和应用程序相关的信息,包括源文件、链编设置以及将所有这些事物集成在一起的规则都由该工程管理。Xcode工程的中心部分是一个工程窗口,如图1-7所示。

图1-7 Xcode工程窗口

通过Xcode链编应用程序的时候,可将其链编至iPhone模拟器或设备。模拟器为应用程序测试提供本地环境,可以通过它测试应用程序是否具有正确行为。当应用程序的基本行为符合预期后,再通过Xcode将其链编到设备上,然后在已连接至计算机的iOS设备上运行程序。在设备上运行应用程序是最终测试环境。在这一测试过程中,Xcode允许将内建调试器绑定至设备上运行的代码,直接在设备上进行调试,在Xcode中运行一个工程的流程如图1-8所示。

2.Interface Builder

Interface Builder以“所见即所”得的方式组装用户界面。通过Interface Builder,可以把事先配置好的组件拖拽到应用程序窗口,最终组装出应用程序的用户界面(如图1-9所示)。这里所说的组件既包括标准系统控件(例如切换控件、文本字段及按键),也包括一些定制视图(用于表现应用程序特有的外观)。

图1-8 在Xcode中运行一个工程的流程

图1-9 使用Interface Builder创建iOS界面

将控件放在窗口表面后,还可以拽着它在四周移动,为其寻找合适的位置。同时,可以使用inspector配置组件属性,并在对象和代码之间建立正确关联。在用户界面达到要求后,可以将这些界面的内容保存到NIB文件(一种定制的资源文件格式)。

在Interface Builder中创建的NIB文件包含UIKit在运行时为应用程序重建对象所需的一切信息。在加载NIB文件的时候,系统会为保存在文件的中每个对象创建一份运行时版本,然后再对其进行配置,使之和Interface Builder中的状态保持一致。另外,系统还将根据制定的关联信息为新建对象和应用程序已有对象建立关联。这些关联可以为代码提供指向NIB文件包含的对象的指针,同时也为这些对象与代码中的用户动作进行通信提供必要信息。

总而言之,在创建应用程序用户界面的时候,使用Interface Builder可以节省大量的时间。使用Interface Builder之后,在创建、配置及摆放界面对象的时候就无须编写定制代码,因为它是一种可视化的编辑器,编辑时所见即运行时所得的界面。

注意 从Xcode 4.0起,Interface Builder已经整合到Xcode中。

3.Instruments

为确保软件具有最佳的用户体验,在iOS应用程序运行于模拟器或设备上时,可以利用Instruments环境分析其性能。Instruments会收集运行程序的数据,并以时间线方式展现数据。可以采集的应用程序数据包括应用程序内存使用情况、磁盘活动、网络活动以及图形性能。时间线视图可以同时显示不同类型的信息,这样,就可以把整个应用程序的行为相互关联起来,而非仅看到某一特定方面的行为。如果还需要更加详细的信息,可以查看Instruments收集的精细采样,如图1-10所示。

图1-10 使用Instruments调整应用程序

除了时间线视图,Instruments还提供一些工具用于对不同时间的应用程序行为进行分析。举个例子,Instruments窗口允许将多次运行的数据保存起来,这样就可以看到应用程序的行为是否确实有所改善,或仍需调整。也可以把这些数据保存在一份Instruments文档中以备随时查看。

4.Shark

Shark是自带的分析iOS应用程序性能的工具。当程序运行在iOS设备上时,可以通过Shark从几个方面对代码进行剖析。剖析结果可认为是应用程序运行时行为的统计采样,可以通过Shark的数据采集和图表化工具对剖析结果进行分析。使用这些工具可以直观地了解应用程序运行时的行为,进而找到潜在的产生问题之处。

1.2 认识Objective-C

Objective-C是在C语言的基础上加入面向对象特性扩充而成的编程语言。在一定程度上,可以把Objective-C看做ANSI版本C语言的一个超集,它支持相同的C语言基本语法,同时扩展了标准ANSI C语言的语法,包括定义类、方法和属性。当然还有其他一些结构的完善和拓展,例如类别(Category)的出现。

Objective-C类的语法和设计都基于第一个面向对象的编程语言Smalltalk 4.1。

1.2.1 发展历程及版本变化

1980年年初,布莱德·确斯(Brad Cox)发明了Objective-C,它是基于SmallTalk-80的语言而发展起来的。Objective-C是在C语言基础上添加扩展而创造出来的能够创建和操作对象的一门新的程序设计语言。对Objective-C最主要的描述是布莱德·确斯于1986年出版的《Object-oriented Programming,An Evolutionary Approach》。

1988年,NeXT Software公司开发了Objective-C语言库,以及NEXTSTEP开发环境。

1996年年底,Apple公司收购NeXT Software公司,使NEXTSTEP/OPENSTEP环境成为苹果操作系统下主要发行版本OS X的基础。该版本的开发环境被Apple公司称为Cocoa。

2006年,Apple发布了Objective-C 2.0,该版本增加了现代的垃圾收集语法改进、运行时性能改进和64位支持等功能。

2007年10月,发布的Mac OS X 10.5中包含了Objective-C 2.0的编译器。

Objective-C是GCC的一个前端,可以编译混合使用C++与Objective-C语法的源文件。Objective-C++是C++的扩展,类似于Objective-C是C的扩展。下面列出了Objective-C与C++的区别。

·Objective-C不支持多重继承(同Java和Smalltalk),而C++语言支持多重继承。

·C++类不能从Objective-C类继承,反之亦然。

·Objective-C是动态类型,所以它的类库比C++容易操作。Objective-C在运行时允许根据字符串名字来访问方法和类,还可以动态连接和添加类。

·C++属于面向对象编程里的Simula 67(一种早期OO语言)学派,而Objective-C属于Smalltalk学派。Simula 67学派更安全,因为大部分错误可以在编译时查出。而Smalltalk学派更灵活,比如一些看来无误的Smalltalk程序拿到Simula 67那里就无法通过。

·在C++里,对象的静态类型决定是否可以发送消息给它,而对于Objective-C来说,这一点由动态类型来决定。

·Objective-C定义内部不能定义C++命名空间。

·Objective-C类的成员变量不能包括不含默认构造函数和/或含有虚方法的C++类对象,但使用C++类指针无此限制(可以在-init方法中进行初始化)。

·C++“传递值”的特性不能用在Objective-C对象上,而只能传递其指针。

·Objective-C声明不能存在于C++模板声明中,反之亦然。但Objective-C类型可以用在C++模板的参数中。

·Objective-C和C++的错误处理语句不同,各自的语句只能处理各自的错误。

·Objective-C错误使得C++对象退出时,C++析构函数不会被调用。新的64位运行时解决了这个问题。

1.2.2 语言性能与分析

Objective-C是非常“实际”的语言。它是一个用C语言写成的很小的运行库,使得应用程序的大小增加很少,与此相比,大部分OO系统需要极大的运行时虚拟机来执行。用Objective-C写成的程序通常不会比其源代码和函式库(通常无须包含在软件发行版本中)大太多,不会像Smalltalk系统,即使只是打开一个窗口也需要极大的内存。由于Objective-C的动态类型特征,Objective-C不能对方法进行内联(inline)一类的优化,使得Objective-C的应用程序比C或C++程序更小。

Objective-C具有较强的编译器适应性。Objective-C可以在现存C编译器基础上实现,而不需要编写一个全新的编译器。这个特性使得Objective-C能利用大量现存的C代码、库、工具和编程思想等资源。现存C库可以用Objective-C包装器来提供一个Objective-C使用的OO风格界面包装,这些特性极大地降低了进入Objective-C的门槛。

Objective-C垃圾回收机制的引进。最初Objective-C不支持垃圾回收机制。Apple发布的Xcode 4已经支持自动释放功能。Xcode 4中的自动释放(Automatic Reference Counting,ARC)机制,不需要用户手动释放(Release)一个对象,而是在编译期间,编译器会自动帮助人们添加那些以前经常写的[NSObject release]。Apple公司在其Mac OS X 10.5中也提供了这种实现。

Objective-C新的命名规则应用。Objective-C不包括命名空间机制,处理这个问题的方法是程序设计师必须为其类别名称加上前缀。由于前缀往往较短(相比命名空间),这时常引发冲突。2007年开始,在Cocoa编程环境中,所有Mac OS X类别和函式均有“NS”前缀(例如NSObject或NSButton)以清楚地标识它们属于Mac OS X核心。使用“NS”是由于这些类别的名称是在NeXTSTEP开发时定下的。

Objective-C独有个性。虽然Objective-C是C的严格超集,但它没有将C的基本类型视为第一级的对象。和C++不同,Objective-C不支持运算子多载(不支持ad-hoc多型)。与C++不同(但和Java相同),Objective-C只允许对象继承一个类别(不设多重继承)。Categories和Protocols可以提供很多多重继承的好处,而且没有什么缺点,例如额外执行时间过重和二进制不兼容。

由于Objective-C使用动态运行时类型,而且所有的方法都是函数调用(有时甚至系统调用也是如此),很多常见的编译时性能优化方法都不能应用于Objective-C(例如内联函数、常数传播、交互式优化、纯量取代与聚集等)。这使得Objective-C性能劣于类似的对象抽象语言(如C++)。不过Objective-C拥护者认为,既然Objective-C运行时消耗较大,Objective-C本来就不应该应用于C++或Java常见的底层抽象。

1.2.3 框架和代码的关系

框架不仅仅是将提供各自服务的各个类混杂在一起的杂物袋。这些面向对象的框架是类的集合,每个类构建一个问题空间,并提供完整的解决方案。框架提供的不是根据需要可以使用的离散服务(如函数库),而是制定并实现整个应用程序的结构,因此编写的代码必须适应该结构。因为此应用程序结构是通用的,可以使其特殊化,以满足特定应用的要求。与其说是设计一个程序并插入资源库函数,不如说是将应用程序代码插入到框架提供的设计中。

要使用框架,必须接受它定义的应用程序结构,然后根据需要,尽可能多地使用和定制它的类,将特定的应用进行改造,以适合该结构。框架中的类相互依赖构成一个整体。乍一看,在应用程序中要求代码适应框架的结构,似乎有限制性。事实刚好相反。框架提供了很多方式修改和扩展其通用行为。它只要求接受这样的观点,所有应用都以同样的基本方式来运行,因为这些应用全部基于同样的结构。打个比方,Objective-C框架就像房屋的框架,而应用程序代码就好比大门、窗户、壁板和其他元素,是这些东西使房子变得与众不同,如图1-11所示。

图1-11 Objective-C框架和应用程序代码

从使用框架和将代码与框架整合的观点看,有两种类。

·现成的。一些类定义了现成对象,也就是可以随时使用的对象。只需要创建类的实例,然后根据需要使用这些实例。

·通用的(或泛型)。对于泛型框架类,可以(在有些情况下必须)创建它们的子类,并覆盖某些方法的实现。通过对它们进行子类化,将代码引入到应用程序结构中。框架会在适当的时刻,调用子类的方法。

将泛型框架类子类化,是将程序特定的代码整合到框架所提供的结构中的主要技巧。但这并不是唯一技巧,而且在很多情况下,也不是首选的技巧。

1.3 基于非苹果机平台搭建开发环境

Xcode主要运行在苹果操作系统上。如果自己有苹果机就很简单,可以直接在上面搭建Objective-C的应用开发环境。但实际情况是当前很多人手中没有苹果机,或者自己的机器没有办法直接安装苹果操作系统。为了学习Objective-C语言,而去买一台价格不菲的苹果机,对于很多人,特别是正在读书的学生,确实是一笔很大的开销。

对于很多人,基本上自己手中都有一台装有Windows操作系统的机器,能不能基于Windows操作系统机器来搭建Objective-C应用开发环境?如果你的机器支持支持虚拟技术(VT),基本上都可以。本节主要围绕这个问题展开介绍。

注意 很多人想感受苹果机的性能,但是又不肯购买正版的苹果机,于是就产生了“黑苹果”。所谓的“黑苹果”就是把机器组成了能够直接安装苹果操作系统的机器,与之对应,把正版的苹果机称为“白苹果”。但是“黑苹果”有一个很难解决的问题——驱动问题,一直没有很好的解决方案。在“黑苹果”上也能安装Xcode,据说可以实行正式发布。

1.3.1 前期准备

在安装Mac OS X之前,需要检验自己的机器是否支持虚拟技术,同时需要下载VMWare、Mac OS X、SDK安装包、支持Mac OS安装的特性启动引导包。

1.支持虚拟技术

运行Mac OS X,硬件上需要电脑支持虚拟技术(VT)。可以使用SecurAble软件检测机器是否支持虚拟技术。有的机器没有启动VT,这就需要在BIOS中开启。

开启VT需几个方面的条件支持:芯片组自身支持、BIOS提供支持、处理器自身支持和操作系统支持。操作系统方面,主流操作系统均支持VMM管理,因此无须考虑。而芯片组方面,从Intel 945(除上网本外)时代开始均已支持,因此也无须考虑。

2.下载VMWare

VMWare-workstation版本不断升级,新的版本功能越来越强大,在使用上也越来越方便,建议下载最新的操作版本。笔者所使用的VMWare-workstation版本是9.0.1。最好再下载一个支持Mac OS X的特性启动引导包,这样可以大大降低安装的复杂性。

3.安装Mac OS X

这里使用的是苹果操作系统Mac OS X 10.7.4。目前苹果开发者中心提供的Xcode最新版本是基于iOS 7.0版本的。安装Xcode 5.0需要安装Mac OS X 10.8,这对硬件的要求相对高些,但目前使用第三代英特尔酷睿i3、i5或者i7的机器基本上都支持Xcode 5.0版本。至于安装什么版本的Mac OS X,可以根据自己的机器配置情况而灵活选择。

4.下载SDK安装包

这里使用的SDK安装包是Xcode 4.5.dmg,可以到苹果开发者中心下载,网址为https://developer.apple.com/devcenter/ios/index.action。

至于下载什么样的SDK,需要考虑自己的机器能装什么版本Mac OS,对于苹果雪豹操作系列,最好下载SDK版本不要超过4.0版本。如果机器配置比较好,安装苹果美洲虎能升级到10.7.4.或者以上,建议下载SDK 4.5版本或者更新的版本。

注意 在苹果官网下载iPhone SDK开发包时,需要用户注册才有权限下载。

5.支持Mac OS X安装的特性启动引导包

网络上有很多种支持Mac OS X的安装特性启动引导包,例如Unlock-All-Vmware和Macosx_Guest_Vmware等,要根据需求选择。

如果不安装支持Mac OS X的特性启动引导包,通过Darwin.iso或Rebel EFI.iso用于引导光盘的ISO镜像文件,也可以成功安装,但是必须在安装成功后,把“CD/DVD”的“Ues Floppy Image File”设置为该引导文件。

1.3.2 创建用于安装Mac OS X的VMWare虚拟机

安装VMWare-workstation是一件很简单的事情,只要按照提示进行下一步就可以。安装VMware Workstation并完成重启后,就可以安装支持Mac OS X的特性启动引导包了。解压安装包后,双击install.cmd文件就可以。安装成功后,将会在“Guest Operating System”项中增添“Apple Mac OS X”选项。

注意 如果你的操作系统是Windows 7或者Windows 8,安装install.cmd文件的时候,必须以管理员模式启用它。

现在VMWare-workstation已经安装成功了,可以创建用于Mac OS X的VMWare虚拟机了。具体的创建步骤如下。

步骤1 选择虚拟机的配置类型。如图1-12所示,推荐选择“Custom”项。

步骤2 虚拟机硬件兼容性,默认设置。

步骤3 虚拟机安装模式,默认设置。

步骤4 选择虚拟机操作系统。

如图1-13所示,选择“Apple Mac OS X”选项,并选择版本“Mac OS X 10.764-bit”。

图1-12 选择虚拟机的配置类型

图1-13 选择操作系统

步骤5 虚拟机命名。可以采用默认名字,也可以自定义名称。对于虚拟机安装的目录,可以选用默认目录,也可以选择其他的安装目录。

步骤6 处理器的配置。

可以使用默认配置,但是一般情况下是根据实际情况进行配置。例如,笔者的机器是双核CPU,所以将处理器配置为1,每个处理器的内核为2,如图1-14所示。

图1-14 处理器的配置

步骤7 配置虚拟机内存的大小。建议不低于4GB。

步骤8 配置虚拟机的网络。建议采取默认的配置,即“NAT”。

步骤9 设置I/O类型。建议采取默认的配置,即“LSI Logic”。

步骤10 选择盘。建议采取默认的配置,即“Create a new virtual disk”。

步骤11 选择盘的类型。建议采取默认的配置,即“SCSI”。

步骤12 设置盘的容量。建议不低于40GB,同时在附属项中选择“Store virtual disk as a single file”。

步骤13 删除软驱配置。在“Hardware”中选择“Floppy”,然后单击“Remove”按钮,否则会引起系统无限重启。如图1-15所示。

图1-15 删除软驱配置

图1-16 光驱的配置

步骤14 配置显卡情况。在“Hardware”中选择“Display”,在该选项中启用“Accelerate 3D graphics”(3D图形加速)。

步骤15 配置CD/DVD格式类型。在“Hardware”中选择“CD/DVD”,然后选择“Advanced”,把光驱设置为SCSI高级模式,如图1-16所示。选择“Use ISO image file”,作为Mac OS镜像文件所在的目录。

1.3.3 安装Mac OS X

上一节我们创建了用于安装Mac OS X的虚拟机,本节介绍如何在虚拟机上安装Mac OS X。

安装Mac OS X其实很简单,跟安装Windows操作系统差不多,下面分步骤介绍,注意本节安装的Mac OS X操作系统版本为10.7.4。

步骤1 启动创建的虚拟机。如图1-17所示,单击“Mac OS X 10.7.4”,右键单击,在显示的菜单项中选择“Power”,然后在其子菜单项中选择“Power On”,将会启动上一节中所创建的虚拟机。

图1-17 启动虚拟机

步骤2 Mac OS X安装启动。安装启动画面显示的时间会稍微长一些,大约2分钟。如图1-18所示。

图1-18 Mac OS X安装启动

步骤3 Mac OS X语言选择。一般选择简体中文。

步骤4 Mac OS X实用工具。

这个步骤将完成对硬盘的设置,在该界面中单击“磁盘工具”项,如图1-19所示。

图1-19 Mac OS X实用工具

步骤5 设置硬盘。在图1-20所示界面中单击硬盘图标,然后对硬盘进行格式化。

图1-20 设置硬盘

格式采取默认的“Mac OS扩展(日志式)”,输入硬盘的名称,例如输入“yingpan”作为硬盘的名称,然后单击“抹掉”,就开始对硬盘进行“格式化”了。格式化完毕,关闭该界面,将会显示步骤4中图1-19所示的界面,在该界面中单击“重新安装Mac OS X”项。

步骤6 Mac OS X安装的启动。在图1-21界面中单击“继续”。

图1-21 Mac OS X安装的启动

步骤7 Mac OS X正式安装。

单击图1-22中的硬盘图标,然后单击“安装”,将正式进入Mac OS X安装。

图1-22 Mac OS X正式安装

步骤8 Mac OS X安装过程要进行多长时间取决于机器的配置,一般需要十几分钟。

步骤9 创建账户,即设置你的用户名和密码。

步骤10 配置自己的键盘模式。一般选择美式的方式。

步骤11 安装完毕,在图1-23所示界面中单击“开始使用Mac”,将会进入登录界面。

图1-23 Mac OS X安装完毕

1.3.4 安装Xcode SDK

上一节已经成功安装了Mac OS X,本节将安装Xcode SDK。在安装Xcode SDK之前,不得不考虑如何解决Windows和Mac OS X数据交互问题。首先介绍如何设置共享目录的问题。

在Windows中下载完Xcode SDK等安装必备文件之后,可以将下载的安装包等文件刻录成光盘;若不想把下载的安装包等文件刻录成光盘,也可以直接将这些文件传到虚拟机VMWare中来进行安装。

这里采用Windows和VMWare共享目录的方法实现。在Windows中需要将Xcode SDK文件夹共享给VMWare中的Mac OS X。设置成文件共享的步骤如下。

步骤1 在Windows中将目录SDK设置为共享。单击鼠标右键,选择属性→共享,选中“在网络上共享这个文件夹”,单击确定按钮。

步骤2 记下Windows的IP地址。

步骤3 通过Mac OS X访问Windows的共享目录,以达到访问Windows的共享文件夹中的Xcode SDK安装包。方法是:在Mac OS X中,单击主菜单Finder菜单项,按住Cmd+K键。

注意 在普通PC或笔记本上(非Mac电脑)使用Cmd+K快捷键连接服务器,在“smb://”后输入Windows的IP地址“192.168.6.222”,单击“连接”按钮即可看到提示“选择需要共享的目录SDK”,单击“好”按钮确认,即可打开该共享目录。

步骤4 在Mac OS X中可以看到Windows共享文件夹,在共享文件夹中找到SDK的安装文件“Xcode 4.5.dmg”,用鼠标双击该文件图标,会看到一个弹出界面。

单击界面中展示的图标,会弹出如图1-24所示的界面。单击“Install”按钮,将会进入安装认证。

图1-24 Xcode SDK安装起始界面

在图1-25所示的安装认证界面中,输入上一节中设置的Mac OS X用户名和密码,然后单击“好”。

图1-25 安装认证

安装进行中的界面如图1-26所示。

图1-26 正在安装

安装成功的界面如图1-27所示。

图1-27 安装成功

单击“Start Using Xcode”将会进入Xcode界面,如图1-28所示。

至此,基于非苹果机平台搭建的开发环境就完成了,现在就可以进行编程开发了。

图1-28 Xcode启动界面

1.4 小结

通过本章的介绍,我们了解了iOS、Objective-C和Xcode三者之间的关系,重点介绍了iOS和开发环境的搭建。iOS包含了丰富的框架,是应用程序开发的基础,后面的章节将会围绕这些框架由易到难逐步展开介绍,掌握这些框架的功能,就可以基于这些框架开发出多彩强大的应用了。