2010-10-28 54 views
0

我有這樣的功能: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("%i\n", inst); 
    } 
} 

我認爲失敗在[instrs addObject:c]。它的目的是迭代NSString的十六進制數字。什麼導致此代碼失敗?

回答

5

A unichar不是一個對象;它是一個整數類型。

NSMutableArray只能容納物體。

如果你真想把它變成一個NSMutableArray,你可以在一個NSNumber對象包住整數值:[instrs addObject:[NSNumber numberWithInt:c]];

但是,有什麼餡的值到一個數組擺在首位的點?你知道如何遍歷字符串並獲取字符,爲什麼把它們放到一個數組中以便再次遍歷它們?

還要注意的是:

  • 的 「%i」 的格式的NSLog期望的整數;你不能傳遞一個對象
  • 十六進制輸出,你想要的「%X」,而不是「%I」
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); 
} 

這比你進場的只是一點點效率(也,在你的方法,你永遠不會releaseinstrs陣列,所以它會在非垃圾收集的環境中泄漏)。

如果字符串包含十六進制數字,那麼你會想,直到它返回NO反覆使用NSScannerscanHexInt:方法。

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

    unsigned number; 

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

    [scanner release]; 
}