您的应用程序以及 UIKit 和其他框架,都建立在 Foundation 框架的基础结构之上。
Foundation 框架提供许多基本的对象类和数据类型,使其成为应用程序开发的基础。
它还制定了一些约定(用于取消分配等任务),使您的代码更加一致,可再用性更好。
使用 Foundation:
创建和管理集,如数组和字典
访问储存在应用程序中的图像和其他资源
创建和管理字符串
发布和观察通知
创建日期和时间对象
自动发现 IP 网络上的设备
操控 URL 流
异步执行代码
在“您的首个 iOS 应用程序”中,您就使用了 Foundation 框架。例如,您使用了 NSString
类的实例,将用户的输入储存在 userName
中。
您还使用了 Foundation 实例方法 initWithFormat:
,创建问候语字符串。
所有 iOS 应用程序都基于 UIKit。没有这个框架,就无法交付应用程序。
UIKit 提供基础结构,用于在屏幕上绘图、处理事件,以及创建通用用户界面元素。
UIKit 还通过管理屏幕上显示的内容,来组织复杂的应用程序。
使用 UIKit:
构建和管理用户界面
处理基于触摸和运动的事件
显示文本和网页内容
优化应用程序以实现多任务
创建自定用户界面元素
在“您的首个 iOS 应用程序”中,您使用了 UIKit。检查应用程序如何启动时,您看到了 UIApplicationMain
函数,它创建了 UIApplication
类(处理传入的用户事件)的一个实例。您实现了 UITextFieldDelegate
协议,以便在用户轻按“Done”键时,让键盘消失。事实上,您使用了 UIKit 中的 UITextField
、UILabel
和 UIButton
类,创建了整个界面。
Core Data、Core Graphics、Core Animation 和 OpenGL ES 框架,是对于应用程序开发很重要的高级技术,因此需要花时间来学习和掌握。
Core Data 管理对象图。借助 Core Data,您可以创建模型对象(称为被管理的对象)。您管理那些对象之间的关系,并通过框架更改数据。
Core Data 利用内建的 SQLite 技术,高效地储存和管理数据。
使用 Core Data:
存储对象和从储存处取回对象
支持基本的撤销/重做
自动验证属性值
对内存中的数据进行过滤、分组和整理
使用 NSFetchedResultsController
管理表格视图中的结果
支持基于文稿的应用程序
高质量的图形,是所有 iOS 应用程序的一个重要组成部分。在 iOS 中创建图形的最简易便捷方法,是将预渲染的图像与 UIKit 框架的标准视图和控制配合使用,并让 iOS 完成绘图。UIKit 还提供用于自定绘图的类,包括路径、颜色、图案、渐变、图像、文本和变换。尽可能地使用 UIKit(较高级的框架),而非 Core Graphics(较低级的框架)。
当您想要编写在 iOS 和 OS X 之间直接共享的绘图代码时,使用 Core Graphics。Core Graphics 框架也称为 Quartz,它在这两个平台上几乎相同。
使用 Core Graphics:
制作基于路径的绘图
使用边缘模糊化渲染
添加渐变、图像和颜色
使用坐标空间变换
创建、显示和解析 PDF 文稿
UIKit 提供的动画,是建立在 Core Animation 技术之上的。如果您需要超出 UIKit 功能的高级动画,可以直接使用 Core Animation。
Core Animation 接口包含在 Quartz Core 框架中。借助 Core Animation,您创建不同层次的层对象,并对它们进行操控、旋转、缩放、变换等等。
通过使用大家所熟悉的 Core Animation 视图式抽象,您可以创建动态用户界面,而无需使用低级的图形 API,如 OpenGL ES 等。
使用 Core Animation:
创建自定动画
给图形添加时序功能
支持关键帧动画
指定图形布局约束
将多层更改分组为原子更新
OpenGL ES 支持基础的 2D 和 3D 绘图。Apple 实施的 OpenGL ES 标准,与设备硬件紧密协作,为全屏幕游戏类应用程序提供很高的帧速率。
使用 OpenGL ES:
创建 2D 和 3D 图形
制作更复杂的图形,如数据可视化、飞行模拟或视频游戏。
访问底层图形硬件
如果您是 Mac 开发者,您会发现 Cocoa 和 Cocoa Touch 应用程序都基于类似的技术。它们具有共同的 API,使得从 Cocoa 迁移更简单。
事实上,部分框架是相同(或几乎相同)的,例如 Foundation 和 Core Data。但是,其他框架与其 OS X 相应的框架有差异。
AppKit 和 UIKit 尤其如此。因此,在将 Mac 应用程序迁移到 iOS 时,必须替换大量界面相关的类,以及与这些类相关的代码
您为 iOS 或 OS X 开发应用程序时,不会是完全孤立的。您将沿用 Apple 和其他人的劳动成果,沿用他们在 Objective-C 框架中开发和收集的类。
框架是运行时可供多个进程共享的类资源库;它包含支持采用该资源库进行软件开发的资源。
Cocoa 和 Cocoa Touch 框架,为您提供了一组相互依赖的类,它们共同工作,以构成应用程序的一部分(通常是相当重要的一部分)。
针对您要编写的程序,您可以按需从一个 C 函数库中选用函数,并确定何时调用它们。
另一方面,框架会将某种设计强加于您的程序,或至少强加于您的程序要尝试解决的某个问题空间。
使用面向对象的框架时,可以调用框架中的类的方法,来执行程序的大部分工作,就和过程化程序中一样。
但是,您也还需要定制泛型框架行为,并通过实施一些方法,让框架在适当时候调用这些方法,对框架行为进行调整,以满足您的需要。
这些方法作为钩子 (hook),将您的代码引入到框架所施加的结构中,增加了能使您的应用程序特征化的行为。
从使用框架和将代码与框架整合的观点看,有两种总的类:
现成的。一些类定义了现成对象,也就是可以随时使用的对象。您只需要创建类的实例,然后根据需要使用这些实例。
通用的(或泛型)。对于泛型框架类,您可以(在有些情况下必须)创建它们的子类,并覆盖某些方法的实现。
通过对它们进行子类化,将代码引入到应用程序结构中。框架会在适当的时刻,调用子类的方法。
将泛型框架类子类化,是将程序特定的代码,整合到框架所提供的结构中的主要技巧。但这并不是唯一技巧,而且在很多情况下,也不是首选的技巧。
在后面的文章中,您将会学习到 Cocoa Touch 和 Cocoa 框架,也包括架构和机制,二者都基于设计模式,可以实现框架对象和自定对象间的更大合作与协调。
创建子类时,需要做出两个基本决定:决定从哪个类(超类)继承和要覆盖该类的哪个方法
子类化是这样一个过程:重新使用现有的类并将其特殊化,以满足您的需要。
有时候一个子类所需要做的,仅是覆盖单个继承的方法,并让该方法做一些与原来的行为稍微不同的事情。
其他子类可能添加一个或两个属性到其超类中(作为实例变量),然后定义方法来访问并操作这些属性,将它们整合到超类行为。
UIView
(为 UIKit 框架中的基础视图类)的子类。尽管子类化在为 iOS 和 OS X 应用程序编程中具有重要作用,但有时候不是解决问题的最佳方式。
如果只想要为一个类添加一些便捷方法,您可能要创建类别,而不是子类。
或者,要加入应用程序特定的行为,可以基于设计模式,使用框架中众多其他资源中的一种,例如委托。
请记住,一些框架类不可以创建子类。参考文稿告诉您某一个框架类是否该用于创建子类。
您可以创建不重新实施任何超类方法的子类,例如该子类可能添加额外状态,并定义新的方法来访问状态及调用该超类的方法。
但是,对于一些子类而言,主要任务便是实施一组特定的、由超类(或超类所采用的协议中)所声明的方法。重新实施继承的方法,称为覆盖该方法。
在框架类中定义的大多数方法,都属于完整实施;它们的存在是让您可以调用它们,以获取该类所提供的服务。
您很少需要覆盖这些方法,也不应尝试这么做。您可以覆盖其他框架方法,但是很少有必要这么做。
然而,一些框架方法是用于被覆盖的;它们的存在是让您将程序特定的行为添加到框架。
一般来说,由这些框架实施的方法,所做的工作对您的应用程序来说没有多大价值,甚至没有价值。
要将内容赋予这些方法,应用程序必须根据自身要求实施这类方法。应用程序运行期间,框架在适当的时候调用这些方法
在子类中覆盖的框架方法,一般不是要亲自调用的方法,至少不是直接的调用。只需要重新实施该方法,剩下的事情就交给框架处理。
事实上,您越是编写应用程序特定版本的方法,在自己的代码中调用它的可能性就越小。
一般来说,框架类会声明公共方法,以便作为开发者的您可以使用它们来执行以下两项操作中的一项:
调用它们,以使用该类提供的服务。
覆盖它们,以便将您的代码引入到框架定义的程序模型中。
有时候,一个方法同时归入这两个类别;在调用时提供有价值的服务,也可以加以策略性的覆盖。
但是,在大多数情况下,如果方法可供调用,则它已经由框架完全定义,您就不需要再在代码中重新定义它。
如果是需要在子类中重新实施的方法,框架会用它来执行特定的任务,因此,它会在适当的时候,自行调用该方法。下图描述两大类型的框架方法。
上图中,自定类 (myMethod
) 的假设方法调用由框架实施的 setNeedsDisplay:
方法。
框架做一些工作为绘制建立环境,然后调用框架声明的方法 drawRect:
,该方法则由自定类覆盖,以执行实际的绘制。
覆盖一个方法不必是一项艰巨的任务。通过编写一两行代码,小心地重新实施一个方法,常常就可以对超类行为做出重大改变。
覆盖框架方法时,必须决定是否要替换继承的方法的行为,或者扩展或补充该行为。
如果想要替换现有的行为,提供自己的方法实现即可;如果想要扩展该行为,调用超类实现并提供自己的代码即可。
通过发送消息(与调用方法的消息相同)到 super
来调用超类实现。通过将消息发送给 super
,您就将该方法的超类代码插入到重新实现的调用点。
举个例子,比如一个假设的 Celebrate
类,定义了一个称为 performFireworks
的方法。
在框架于视图中绘画并播放烟火动画后,您想在视图显示一个横幅。下图说明在这种情况下调用 super
的方式:
因此,决定是否调用 super
,基于您打算如何重新实施方法:
如果打算补充超类实现的行为,请调用 super
。
如果打算替换超类实现的行为,就不要调用 super
。
如果您要补充超类行为,另一个需要重点考虑的,是何时调用一个方法的超类实现。您可能想超类代码在执行您的代码前,就做好它的工作,反之亦然。
参与评论
手机查看
返回顶部