0

我有包含 NSDictionaries 的 NSArray。我需要将其转换为 CFMutableArray,其中包含 CFMutableDictionary 类型的项目,其中包含 char* 键和值。

- (CFArrayRef)cStringDataSet {
CFArrayCallBacks cfTypeCallBacks = {0, NULL, NULL, NULL, CFEqual};
CFMutableArrayRef cStrDataSet = CFArrayCreateMutable(NULL, 0, &cfTypeCallBacks);

CFDictionaryKeyCallBacks charKeyCallBacks = {0, NULL, NULL, NULL, charEqual, charHash};
CFDictionaryValueCallBacks charValueCallBacks = {0, NULL, NULL, NULL, charEqual};

for (NSDictionary *dict in dataSet) {
    CFMutableDictionaryRef cStrDict = CFDictionaryCreateMutable(NULL, 0, &charKeyCallBacks, &charValueCallBacks);

    for (NSString *key in [dict allKeys]) {
        const char *cStrKey = [key UTF8String];
        const char *cStrValue = [[[dict objectForKey:key] description] UTF8String];

        CFDictionaryAddValue(cStrDict, cStrKey, cStrValue);
    }

    CFArrayAppendValue(cStrDataSet, cStrDict);
}

return cStrDataSet;
}

charEqual 和 charHash 定义如下:

Boolean charEqual(const void *ptr1, const void *ptr2) {
char *char1 = (char*)ptr1;
char *char2 = (char*)ptr2;

if (strlen(char1) != strlen(char2)) {
    return false;
}

return !strncmp(char1, char2, strlen(char1));
}

CFHashCode charHash(const void *ptr) {
    return (CFHashCode)((int)ptr);
}

现在我想使用 CFEqual 比较两个 CFArrayRef,但从未调用函数 charEqual 并且 CFEqual 总是返回“false”。

4

1 回答 1

1

您违反了对等式和哈希码的约束。如果两个字符串比较相等,那么它们也必须具有相同的哈希码。如果字典是使用桶实现的,它首先会计算一个哈希码,只有找到该哈希码的匹配项,它才会调用比较函数。

您需要确保仅当charEqual(char1, char2)为真,这意味着您需要根据字符串的值而不是其地址重新实现。 charHash(char1) == charHash(char2)charHash

于 2011-02-16T14:14:18.657 回答