CoreFoundation框架详细解析(三) —— 不透明类型
版本记录
版本号 | 时间 |
---|---|
V1.0 | 2018.02.01 |
前言
与Foundation框架不同的是,
Core Foundation
框架(CoreFoundation.framework)
是一组C语言接口,它们为iOS应用程序提供基本数据管理和服务功能。接下来几篇我们一起重新审视和详细的看一下这个框架。感兴趣的可以看上面写的几篇。
1. CoreFoundation框架详细解析(一) —— 基本概览
2. CoreFoundation框架详细解析(二) —— 简介
Opaque Types - 不透明类型
Core Foundation的支持封装和多态函数的对象模型是基于不透明类型的。
基于不透明类型的对象的各个字段对客户端是隐藏的,但类型的函数提供对这些字段的大部分值的访问。 图1描述了它“ hides”
的数据中的一个不透明类型,以及它呈现给客户端的界面。
注意:“Class”不是用来指不透明的类型,因为尽管类和不透明类型在概念上相似,许多人可能会觉得这个词很混乱。 但是,Core Foundation文档经常将这些类型的特定数据承载实例称为“objects”。
Core Foundation有许多不透明的类型,这些类型的名称反映了它们的预期用途。 例如,CFString是一个不透明的类型,用于表示Unicode字符数组,并对其进行操作。 (“CF”当然是Core Foundation的前缀。)CFArray是基于索引的集合函数的不透明类型。 支持不透明类型的函数,常量和其他辅助数据类型通常在具有类型名称的头文件中定义;例如,CFArray.h
包含CFArray类型的符号定义。
Advantages of Opaque Types - 不透明类型的优势
对于某些情况来说,不透明的类型可能会阻止直接访问结构的内容,从而造成不必要的限制。也有可能会有不明朗的类型的开销,可能会影响程序的性能。但不透明类型的好处超过了这些看似的限制。
不透明类型为底层功能的实现提供了更好的抽象和更多的灵活性。通过隐藏结构字段等细节,Core Foundation可以在这些细节发生变化时减少客户端代码中可能出现的错误。此外,不透明类型允许优化,如果暴露可能会造成混淆。例如,CFString“正式”表示UniChar
类型的16位字符数组。但是,CFString可能选择将ASCII范围内的一系列字符存储为8位值。复制一个不可变的对象可能会(通常会)导致对该对象的共享引用,而不是内存中的两个单独的对象(请参阅Memory Management Programming Guide for Core Foundation)。
继续使用CFString的例子,使用不透明类型来存储字符似乎很重要。但事实证明,这种存储的CPU成本并不比使用简单的C字符数组高很多,而且存储成本往往更低。另外,不透明不一定意味着不透明类型不能直接提供访问内容的机制。例如,CFString为此提供了CFStringGetCStringPtr
函数。
最后,你可以在一定程度上定制一些不透明的类型。例如,集合类型允许您定义用于调用集合中每个成员的函数的回调函数。
后记
本篇已结束,后面更精彩~~~