Objective c 目标NSC字符串问题

Objective c 目标NSC字符串问题,objective-c,nsstring,Objective C,Nsstring,我有一个NSString,需要逐个字符检查,并且: examine char perform calculation loop (until string ends) 你有没有想过最好的方法?我需要转换NSString吗 到NSArray还是C字符串 最简单的方法是使用NSString的方法: int-charIndex; 对于(charIndex=0;charIndex

我有一个NSString,需要逐个字符检查,并且:

 examine char
    perform calculation
 loop (until string ends)
你有没有想过最好的方法?我需要转换NSString吗
到NSArray还是C字符串

最简单的方法是使用
NSString
的方法:

int-charIndex;
对于(charIndex=0;charIndex<[myString length];charIndex++)
{
unichar testChar=[myString characterAtIndex:charIndex];
//…您的代码在这里
}

-characterAtIndex:
是最简单的方法,但最好是下拉到CFString并使用CFStringInlineBuffer,如下方法所示:

- (NSIndexSet *) indicesOfCharactersInSet: (NSCharacterSet *) charset
{
    if ( self.length == 0 )
    return ( nil );

    NSMutableIndexSet * set = [NSMutableIndexSet indexSet];

    CFIndex i = 0;
    UniChar character = 0;
    CFStringInlineBuffer buf;
    CFStringInitInlineBuffer( (CFStringRef)self, &buf, CFRangeMake(0, self.length) );

    while ( (character = CFStringGetCharacterFromInlineBuffer(&buf, i)) != 0 )
    {
        if ( [charset characterIsMember: character] )
            [set addIndex: i];

        i++;
    }

    return ( set );
}

这样更好,因为它可以一次抓取多个字符,根据需要抓取更多字符。它实际上是ObjC 2中(id x in y)的字符串版本。

虽然代码更复杂,但利用NSString/CFString免费桥接的好处是额外的积分!我认为您的建议更节省空间,但由于函数调用较少,时间效率略高。然而,这将是一场势均力敌的竞赛,差别可能很小。它通常会更快,因为它会一次移动一大块数据,所有这些数据都可以放在缓存内存中。-characterAtIndex:version可能需要更频繁地访问主内存。它还支持更好的循环展开和类似的编译器优化,因为所有的方法都是内联的,这使编译器有机会根据CFStringInlineBuffer函数实现的细节进行优化。
- (NSIndexSet *) indicesOfCharactersInSet: (NSCharacterSet *) charset
{
    if ( self.length == 0 )
    return ( nil );

    NSMutableIndexSet * set = [NSMutableIndexSet indexSet];

    CFIndex i = 0;
    UniChar character = 0;
    CFStringInlineBuffer buf;
    CFStringInitInlineBuffer( (CFStringRef)self, &buf, CFRangeMake(0, self.length) );

    while ( (character = CFStringGetCharacterFromInlineBuffer(&buf, i)) != 0 )
    {
        if ( [charset characterIsMember: character] )
            [set addIndex: i];

        i++;
    }

    return ( set );
}