尽管概念上的CFString对象像一个Unicode字符数组一样存储字符串,实际上他经常更有效的存储字符串。用一个CFString对象去表现一个字符串比用
UniChar数组需要的内存经常会少一点。
对于不可变的字符串,这个效率是可能的,因为一些标准8位编码字符(ASCII)和有关的编码如ISO 拉丁-1,是16位Unicode的表现子集,在Unicode
编码构架中使用ASCII字符值,举个例子,左边8位是0,右边8位表现字符的8位编码。如果编码允许快速转换到Unicode字符,字符对象仅尝试这个压
缩的存储类型。
图一 一个源自ASCII编码的不可变CFString的存储结果
可变的CFString对象执行类似类型的优化。举个例子,一个可变的字符串可能有8位后备存储,直到一个字符上有ASCII范围的插入。
CFString对象使用其他"手段"保存内存,例如一个可增长的引用计数(Reference Count)当一个CFString拷贝时。对于大的字符串,他们可能从文件,资源
和保存的B-tree结构中加载。
使用CFString对象可能会有一些内存开销,它的通常范围是4到12个字节,取决于可变的特性和不同的平台。但是字符串采用的内存节省策略不仅仅弥补了这
、方面的开销。
除了其内部存储机制,一些字符串对象的程序接口可以让你获取其字符串存取所有权,让你更快的访问它。一些字符串对象函数取得本地缓冲区中的所有存取
的字符,或者更大的字符串,可以让你在行缓冲区中更有效的处理字符串。
一些CFString创建函数复制字符串在用户提供缓冲区到字符串的后备存储(backing store)。在一个高级的使用情景中,你可能发现自己使用后备存储是非常
有用的。带有NoCopy的函数是用户的缓冲区后备存储,能创建CFString对象的指针。(图2(13页)是一个示例)NoCopy限定符,仅仅是一个暗示,在某些
情况CFString对象可能复制缓冲区内容到内部存储中。
你可以使用CFStringCreateMutableWithExternalCharactersNoCopy函数更多的控制字符串的后备存储。这个函数创建一个可变CFString的引用对象,允许你
取得保存对象自符的Unicode缓冲区的所有权。这个对象自己指向后备存储缓冲区。当你改变缓冲区的内容时,你只需要通知这个对象。参看“客户端自备的可
变字符串”,它介绍的更多。
图 二 CFString对象和他们的后备缓冲区