【问题标题】: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 数组,因此它会在非垃圾收集环境中泄漏)。
如果字符串包含十六进制数字,那么您将需要重复使用NSScanner 的scanHexInt: 方法,直到它返回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”