0

我有这个功能:

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]。它的目的是遍历 NSString 的十六进制数。是什么导致此代码失败?

4

2 回答 2

5

Aunichar不是一个对象;它是一个整数类型。

NSMutableArray只能容纳物体。

如果你真的想把它放入一个NSMutableArray中,你可以将整数值包装在一个NSNumber对象中:[instrs addObject:[NSNumber numberWithInt:c]];

但是,首先将值填充到数组中的意义何在?您知道如何遍历字符串并获取字符,为什么将它们放入数组中只是为了再次遍历它们?

另请注意:

  • "%i" NSLog 格式需要一个整数;你不能把它传递给一个对象
  • 对于十六进制输出,您需要“%x”,而不是“%i”
于 2010-10-28T03:21:22.323 回答
1

如果该函数仅用于将字符显示为十六进制值,则可以使用:

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];
}
于 2010-10-28T05:45:19.627 回答