字符串存取(CFString)

尽管概念上的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对象和他们的后备缓冲区

                       


 

                               

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值