访问字符串对象的内容(Accessing the Content of String Objects)CFString

来源:互联网 发布:大数据新技术ppt 编辑:程序博客网 时间:2024/05/04 19:38

CFString对象两个本质的属性是一个Unicode字符数组和数组中字符的数量。一些CFString函数不仅获取这些属性,特别是字符,去有效装换到各种需要的格式。

CFStringGetBytes函数,复制一个CFString对象的内容到一个客户端提供的字节缓冲区,在“基本转换例程”描述。它之所以在另外的章节中描述,它拥有特别适合编码转换的功能。

像C字符串一样获取内容

你可能使用一些需要C字符串参数的编程接口。由于性能原因,访问CFString内容的策略和一个常用C字符串访问一样,首先获取这个字符串适当类型的指针,如果失败了,复制内容到本地缓冲区中,

             列表1        像一个C字符串一样访问CFString内容

CFStringRef str;
    CFRange rangToProcess;
    const char* bytes;
    
    str = CFStringCreateWithCString(NULL, "Hello World", kCFStringEncodingMacRoman);
    bytes = CFStringGetCStringPtr(str, kCFStringEncodingMacRoman);
    
    if (bytes == NULL) {
        char localBuffer[10];
        Boolean success;
        success = CFStringGetCString(str, localBuffer, 10, kCFStringEncodingMacRoman);
    }

这个函数允许你指定Unicode字符串应当被转换的编码。以Ptr结尾的函数要么立即返回需要的指针,在通常情况下,他们可能返回NULL。如果是后面的情况,你应该使用CFStringGetCString。

CFStringGetCString函数缓冲区或者在栈区或者在一块分配的内存中。这些函数取得字符时可能会失败,但是这种情况仅出以下两种情形中:CFString从Unicode内容转换到指定的编码失败或者缓冲区太小了。如果你需要一个字符缓冲区副本,或者不关注代码的性能,你可以简单的调用CFStringGetCString函数,而不去尝试取得指针。

像Unicode字符创一样获取内容

字符创对象提供一对类似使用16位编码缓冲区C字符串访问CFString函数。CFStringGetCharactersPrt和CFStringGetCharacters。这些函数的主要使用方法是相同的;你可以首先尝试去获取指向字符的指针,如果失败,你尝试去拷贝字符到提供的缓冲区中。这些函数是不同的,然而,他们需要一个参数,指定字符串的长度。

列表2 阐述了这些函数常用的用法

      列表2       像Unicode字符一样访问CFString内容

CFStringRef str;
    const UniChar* chars;
    
    str = CFStringCreateWithCString(NULL, "Hello World", kCFStringEncodingMacRoman);
    chars = CFStringGetCharactersPtr(str);
    if (chars == NULL) {
        CFIndex length = CFStringGetLength(str);
        UniChar *buffer = malloc(length*sizeof(UniChar));
        CFStringGetCharacters(str, CFRangeMake(0, length), buffer);
        free(buffer);
    }
  这个例子描述了一个分配缓冲区(malloc),而不是栈区。你可以选择使用。因为你使用CFStringGetCharacters函数需要知道缓冲区的大小,分配内存较容易实现但是不高效。如果你为字符分配内存,当然,你必须释放缓冲区当你不在使用的时候。

字符处理

一些情况下你可能需要接收CFString的内容,不是整个字符块,而是一次接收一个Unicode字符。或许你可能寻找个别字符或字符序列,例如特别的控制字符去表明“recode”的开始和结束。字符串对象给你三种途径去处理Unicode字符。

第一种方法使用CFStringGetCharacters函数,在“像Unicode字符创一样获取内容”描述了复制字符到本地缓冲区中,然后循环遍历在缓冲区中的字符。但是这种技术非常耗费内存,特别是当大量的字符被调用。

第二种方法是使用CFStringGetCharacterAtIndex函数访问一个字符在同一时间,如列表3中阐述。

          列表 3      每次获取一个字符串

CFIndex length,i;
    UniChar uchar;
    CFStringRef str;
    
    str = CFStringCreateWithCString(NULL, "Hello World", kCFStringEncodingMacRoman);
    length = CFStringGetLength(str);
    for (i = 0; i<length; i++) {
        uchar = CFStringGetCharacterAtIndex(str, i);
        printf("%c",uchar);

    }

尽管这个函数不会为一块字符而要求一大块的内存,使用循环是效率很低得。由于这个原因,使用CFStringGetCharacters函数代替。

第三种技术处理字符,如列表4所示,结合了一次性的方便与效率的批量字符串的访问。当你在做顺序处理字符的时候这些内联函数CFStringInitInlineBuffer和CFStringGetCharacterFromInlineBuffer给你快速的访问字符串的内容,使用这个编程接口,和CFStringInlineBuffer结构(通常在栈区)一起调用CFStringInitInlineBuffer函数和一个CFString字符范围。然后调用CFStringGetCharacterFromInlineBuffer多次,你需要使用一个索引到此范围内相对于开始的范围。因为这些都是内联函数他们访问CFString对象定期填补in-line缓冲区。

      列表4     在一个内联缓冲区中处理字符

 CFStringRef str;
    CFStringInlineBuffer inlineBuffer;
    CFIndex length,cnt;
    
    str = CFStringCreateWithCString(NULL, "Hello World", kCFStringEncodingMacRoman);
    length = CFStringGetLength(str);
    CFStringInitInlineBuffer(str, &inlineBuffer, CFRangeMake(0, length));
    
    for (cnt = 0; cnt < length; cnt++) {
        UniChar ch = CFStringGetCharacterFromInlineBuffer(&inlineBuffer, cnt);
    }


原创粉丝点击