Objective-C Итерация по NSString для получения символов - PullRequest
0 голосов
/ 28 октября 2010

У меня есть эта функция:

void myFunc(NSString* data) {
    NSMutableArray *instrs = [[NSMutableArray alloc] initWithCapacity:[data length]];
    for (int i=0; i < [data length]; i++) {
        unichar c = [data characterAtIndex:i];
        [instrs addObject:c];
    }
    NSEnumerator *e = [instrs objectEnumerator];
    id inst;
    while (inst = [e nextObject]) {
        NSLog("%i\n", inst);
    }
}

Я думаю, что это не удается на [instrs addObject:c]. Его цель - перебирать шестнадцатеричные числа строки NSSt. Что приводит к сбою этого кода?

Ответы [ 2 ]

5 голосов
/ 28 октября 2010

A unichar не является объектом; это целочисленный тип.

NSMutableArray может содержать только объекты.

Если вы действительно хотите поместить его в NSMutableArray, вы можете заключить целочисленное значение в объект NSNumber: [instrs addObject:[NSNumber numberWithInt:c]];

Но какой смысл вначале вставлять значения в массив? Вы знаете, как перебирать строки и получать символы, зачем помещать их в массив, чтобы снова перебирать их?

Также обратите внимание, что:

  • формат NSLog "% i" ожидает целое число; Вы не можете передать ему объект
  • для шестнадцатеричного вывода вы хотите "% x", а не "% i"
1 голос
/ 28 октября 2010

Если функция предназначена только для отображения символов в виде шестнадцатеричных значений, вы можете использовать:

void myFunc(NSString* data)
{
    NSUInteger len = [data length];
    unichar *buffer = calloc(len, sizeof(unichar));

    if (!buffer) return;

    [data getCharacters:buffer range:NSMakeRange(0, len)];

    for (NSUInteger i = 0; i < len; i++)
        NSLog(@"%04x", (unsigned) buffer[i]);

    free(buffer);
}

Это немного более эффективно, чем ваш подход (кроме того, в вашем подходе вы никогда не используете массив release instrs, поэтому он будет вытекать в среде без сбора мусора).

Если строка содержит шестнадцатеричных чисел, вам нужно будет многократно использовать метод NSScanner scanHexInt:, пока он не вернет NO.

void myFunc(NSString* data)
{
    NSScanner *scanner = [[NSScanner alloc] initWithString:data];

    unsigned number;

    while ([scanner scanHexInt:&number])
        NSLog(@"%u", number);

    [scanner release];
}
...