第47条:熟悉系统框架

  第七章

  虽说不使用系统框架也能编写 Objective-C 代码,但几乎没人这么做。即便是NSObject 这个标准的根类,也属于 Foundation 框架,而非语言本身。若不使用 Foundation ,就必须自己编写根类,同时还要自己来写 collection、事件循环,以及其他会用到的类。此外,若不用系统框架,也就无法使用 Objective-C 来开发 Mac OS X 及 iOS 应用程序了。系统框架很强大,不过它是历经多年研发才成了今天这个样子的。因此,里面也许会有不合时宜而且用起来很蹩脚的地方,但也会有遗失的珍宝藏于其间。

  本条要点:(作者总结)

  • 许多系统框架都可以直接使用。其中最重要的是 Foundation 与 CoreFoundation,这两个框架提供了构建应用程序所需的许多核心功能。
  • 很多常见任务都能用框架来做,例如音频与视频处理、网络通信、数据管理等。
  • 请记住:用纯C 写成的框架与用 Objective-C 写成的一样重要,若想成为优秀的 Objective-C 开发者,应该掌握C 语言的核心概念。  

 

  编写 Objective-C 应用程序时几乎都会用到系统框架,其中提供了许多编程中经常使用的类,比如 collection。若是不了解系统框架所提供的内容,那么就可能会把其中已经实现过的东西又重写一遍。用户升级操作系统后,你所开发的应用程序也可以使用最新版的系统库了。所以说,如果直接使用这些框架中的类,那么应用程序就可以得益于新版系统库所带来的改进,而开发者也就无须手动更新其代码了。

  将一系列代码封装为动态库(dynamic library),并在其中放入描述其接口的头文件,这样做出来的东西就叫框架。有时为 iOS 平台构建的第三方框架所使用的是静态库(static library),这是因为iOS 应用程序不允许在其中包含动态库。这些东西严格来讲并不是真正的框架。然而也经常视为框架。不过,所有iOS 平台的系统框架仍然使用动态库。

  在为 Mac OS X 或 iOS 系统开发“带图形界面的应用程序”(graphical application)时,会用到名为 Cocoa 的框架,在 iOS 上称为 Cocoa Touch。其实 Cocoa 本身并不是框架,但是里面集成了一批创建应用程序时经常会用到的框架。

  开发者会碰到的主要框架就是 Foundation,就是 NSObject、NSArray、NSDictionary 等类都在其中。Foundation 框架中的类,使用 NS 这个前缀,此前缀是在 Objective-C 语言用作 NeXTSTEP 操作系统的编程语言时首度确定的。Foundation 框架真可谓所有 Objective-C 应用程序的“基础”,若是没有它,那么本书大部分内容就不知所云了。

  Foundation 框架不仅提供了 collection 等基础核心功能,而且还提供了字符串处理这样的复杂功能。比方说,NSLinguisticTagger 可以解析字符串并找到其中的全部名词、动词、代词等。简言之,Foundation 所提供的功能远远不止那几个基础类。

  还有个与 Foundation 相伴的框架,叫做 CoreFoundation。虽然从技术上讲,CoreFoundation 框架不是 Objective-C 框架,但它却是编写 Objective-C 应用程序时所应熟悉的重要框架,Foundation 框架中有许多功能,都可以在此框架中找到对应的 C 语言API。coreFoundation 与 Foundation 不仅名字相似,而且还有更为紧密的联系。有个功能叫做 “无缝桥接” (toll-free bridging),可以把CoreFoundation 中的C语言数据结构平滑转换为 Foundation 中的 Objective-C 对象,也可以反向转换。比方说,Foundation 框架中的字符串是 NSString ,而它可以转换为 CoreFoundation 里与之等效的 CFString 对象。无缝桥接技术是用某些相当复杂的代码实现出来的,这些代码可以使运行期系统把 CoreFoundation 框架中的对象视为普通的Objective-C 对象。但是,像无缝桥接这么复杂的技术,想自己编写代码实现它,可不太容易。开发程序时可以使用此功能,但若决定以手工编码的方式来复制这套机制,则需要认真审视自己的想法了。

  除了 Foundation 与 CoreFoundation 之外,还有很多系统库,其中包括但不限于下面列出的这些:

  • CFNetwork 此框架提供了C语言级别的网络通信能力,它将“BSD套接字”(BSD socket)抽象成易于使用的网络接口。而 Foundation 则将该框架里的部分内容封装为 Objective-C 语言的接口,以便进行网络通信,例如可以用 NSURLConnection 从 URL 中下载数据。
  • CoreAudio 该框架所提供的 C语言API 可用来操作设备上的音频硬件。这个框架属于比较难用的那种,因为音频处理本身就很复杂。所幸由这套API 可以抽象出另外一套 Objective-C 式API,用后者来处理音频问题会更简单些。
  • AVFoundation 此框架所提供的Objective-C 对像可用来回放并录制音频及视频,比如能够在 UI 视图类里播放视频。
  • CoreData 此框架所提供的 Objective-C 接口可将对象放入数据库,以便持久保存。CoreData 会处理数据的获取及存储事宜,而且可以跨越 Mac OS X 及 iOS 平台。
  • CoreText 此框架提供的C 语言接口可以高效执行文字排版及渲染操作。

  除此之外,还有别的框架,然而通过此处列出的这几个框架,可以看出Objective-C 编程的一项重要特点,那就是:经常需要使用底层的 C 语言级 API。用 C 语言来实现 API 的好处是,可以绕过 Objective-C 的运行期系统,从而提升执行速度。当然,由于ARC 只负责 Objective-C 的对象,所以使用这些 API 时尤其需要注意内存管理问题。若想使用这种框架,一定得先熟悉 C  语言基础才行。

  读者可能会编写使用 UI 框架的 Mac OS X 或 iOS 应用程序。这两个平台的核心UI 框架分别叫做 AppKit 及 UIKit ,它们都提供了构建在 Foundation 与 CoreFoundation 之上的 Objective-C 类。框架里含有 UI 元素,也含有粘合机制,令开发者可将所有有关内容组装为应用程序。在这些主要的 UI 框架之下,是 CoreAnimation 与 CoreGraphics 框架。

  CoreAnimation 是用 Objective-C 语言写成的,它提供了一些工具,而 UI 框架则用这些工具来渲染图形并播放动画。开发者编程时可能从来不回深入到这种级别,不过知道该框架总是好的。CoreAnimation 本身并不是框架,它是 QuartzCore 框架的一部分。然而在框架的国度里,CoreAnimation 仍应算作 “一等公民”(first-class citizen)。

  CoreGraphics 框架以 C 语言写成,其中提供了 2D 渲染所必备的数据结构与函数。例如,其中定义了CGPoint、CGSize、CGRect 等数据结构,而 UIKit 框架中的 UIView 类在确定视图控件之间的相对位置时,这些数据结构都要用到。

  还有很多框架构建在 UI 框架之上,比方说 MapKit 框架,它可以为 iOS 程序提供地图功能。又比如 Social 框架,它为 Mac OS X 及 iOS 程序提供了社交网络(social networking)功能。开发者通常会将这些框架与操作系统平台所对应的核心 UI 框架结合起来使用。

  总的来说,许多框架都是安装 Mac OS X 与 iOS 系统时的标准配置。所以,在打算编写新的工具类之前,最好在系统框架里搜一下,通常都有写好的类可供直接使用。

END

posted @ 2017-08-25 07:44  鳄鱼不怕牙医不怕  阅读(196)  评论(0编辑  收藏  举报