Puede acelerar -characterAtIndex:
mediante la conversión a su primer IMP formulario:
NSString *str = @"This is a test";
NSUInteger len = [str length]; // only calling [str length] once speeds up the process as well
SEL sel = @selector(characterAtIndex:);
// using typeof to save my fingers from typing more
unichar (*charAtIdx)(id, SEL, NSUInteger) = (typeof(charAtIdx)) [str methodForSelector:sel];
for (int i = 0; i < len; i++) {
unichar c = charAtIdx(str, sel, i);
// do something with C
NSLog(@"%C", c);
}
EDIT: Parece ser que el CFString
Reference contiene el siguiente método:
const UniChar *CFStringGetCharactersPtr(CFStringRef theString);
Esto significa que puede hacer lo siguiente:
const unichar *chars = CFStringGetCharactersPtr((__bridge CFStringRef) theString);
while (*chars)
{
// do something with *chars
chars++;
}
Si no desea asignar m Emory para hacer frente al buffer, este es el camino a seguir.
Si está tan preocupado por el rendimiento, sería mejor usar NSData y acceder a la matriz de bytes de eso. – joerick
Resulta que CFString en realidad tiene una forma de hacerlo, en CFStringGetCharactersPtr ... –
"... pero va a ser más lento que ...": esto se llama ** optimización prematura **. Está haciendo suposiciones sobre el rendimiento incluso antes de saber si el rendimiento va a ser un problema. Debe implementarlo de la manera más obvia (utilizando 'characterAtIndex') y optimizarlo solo si tiene problemas de rendimiento. – Sulthan