如果它确实是一个瓶颈,你可以使用底层的 CFDictionaryRef 而不是 NSMutableDictionary,来创建一个直接存储整数的字典,而不是将它们装箱到 NSNumber 值中。
阅读有关 CFDictionaryCreateMutable 和 CFDictionaryValueCallBacks 的文档以了解详细信息,但基本思想是您的保留和释放什么都不做,您的描述会即时生成一个 NSNumber(或者只是执行 stringWithFormat:"%d"),并且您的 equal 比较整数直接地。
这是一个显示代码中棘手部分的示例:
#import <CoreFoundation/CoreFoundation.h>
#import <Foundation/Foundation.h>
CFStringRef intdesc(const void *value) {
int i = (int)value;
CFNumberRef n = CFNumberCreate(NULL, kCFNumberIntType, &i);
CFStringRef s = CFCopyDescription(n);
CFRelease(n);
return s;
}
Boolean inteq(const void *value1, const void *value2) {
int i1 = (int)value1, i2 = (int)value2;
return i1 == i2;
}
int main(int argc, char *argv[]) {
CFDictionaryValueCallBacks cb = { 0, NULL, NULL, &intdesc, &inteq };
CFMutableDictionaryRef d =
CFDictionaryCreateMutable(NULL,
0,
&kCFTypeDictionaryKeyCallBacks,
&cb);
CFDictionarySetValue(d, @"Key1", (void *)1);
CFDictionarySetValue(d, @"Key2", (void *)2);
CFStringRef s = CFCopyDescription(d);
NSLog(@"%@", s);
CFRelease(s);
CFRelease(d);
return 0;
}
如果你要做很多这样的事情,你应该把它包在 ObjC 中(特别是如果你使用 ARC),但这留给读者作为练习。