【问题标题】:Objective-C Iterating through an NSString to get charactersObjective-C 遍历 NSString 以获取字符
【发布时间】:2011-05-01 16:01:35
【问题描述】:

我有这个功能:

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

【问题讨论】:

    标签: objective-c nsmutablearray iteration nsenumerator


    【解决方案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 数组,因此它会在非垃圾收集环境中泄漏)。

    如果字符串包含十六进制数字,那么您将需要重复使用NSScannerscanHexInt: 方法,直到它返回NO

    void myFunc(NSString* data)
    {
        NSScanner *scanner = [[NSScanner alloc] initWithString:data];
    
        unsigned number;
    
        while ([scanner scanHexInt:&number])
            NSLog(@"%u", number);
    
        [scanner release];
    }
    

    【讨论】:

      【解决方案2】:

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

      NSMutableArray 只能容纳对象。

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

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

      还要注意:

      • “%i”NSLog 格式需要一个整数;你不能给它一个对象
      • 对于十六进制输出,您需要“%x”,而不是“%i”

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多