Objective-C通过NSString迭代获取字符

我有这个功能:
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("%in", inst);
    }
}
我认为它失败了
[instrs addObject:c]
。它的目的是遍历NSString的十六进制数。导致此代码失败的原因是什么?     
已邀请:
A
unichar
不是一个对象;它是一个整数类型。
NSMutableArray
只能容纳物品。 如果你真的想把它放入
NSMutableArray
,你可以将整数值包装在一个
NSNumber
对象中:
[instrs addObject:[NSNumber numberWithInt:c]];
但是,首先将值填充到数组中的重点是什么?你知道如何遍历字符串并获取字符,为什么将它们放入数组只是为了再次遍历它们? 另请注意: “%i”NSLog格式需要一个整数;你无法传递它的对象 对于十六进制输出,您需要“%x”,而不是“%i”     
如果该函数仅用于将字符显示为十六进制值,则可以使用:
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);
}
这比你的方法更有效(同样,在你的方法中你永远不会
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];
}
    

要回复问题请先登录注册