iOS6将std :: map转换为NSDictionary时内存泄漏

时间:2015-03-18 03:43:17

标签: c++ ios ios6 objective-c++

我正在编写一种方法将C ++ std::map<std::string,std::string>转换为NSDictionary,如下所示:

NSDictionary* NSDictionaryFromMap(const StringMap& map){
    NSMutableDictionary * dict = [NSMutableDictionary dictionary];

    NSLog(@"NSDictonaryFromMap() - size:%d", (int)map.size());

    for (auto it = map.begin(); it != map.end(); it++){
        NSString * key = (0 == it->first.length())?(@""):(@(it->first.c_str()));
        NSString * value = (0 == it->second.length())?(@""):(@(it->second.c_str()));

        [dict setObject:value forKey:key];
        NSLog(@"NSDictonaryFromMap() - key:%@ value:%@", key, value);
    }

    NSDictionary * nd = [NSDictionary dictionaryWithDictionary:dict];
    dict = NULL;

    NSLog(@"NSDictonaryFromMap() - dictionary:%@", nd);
    return nd;
}

但是在调用此方法时我遇到了一些内存泄漏。对不起,我不能在这里发布图片。在仪器中,它突出显示四个函数调用的内存泄漏

NSMutableDictionary * dict = [NSMutableDictionary dictionary];
NSString * key = (0 == it->first.length())?(@""):(@(it->first.c_str()));
NSString * value = (0 == it->second.length())?(@""):(@(it->second.c_str()));
[dict setObject:value forKey:key];

在iOS 7和iOS 8上,没有任何内存泄漏,但在iOS 6上,它有。 如何修复iOS6的漏洞?

我也在Apple论坛上发布了这个问题: https://devforums.apple.com/message/1114878#1114878

2 个答案:

答案 0 :(得分:0)

从你所说的,似乎返回的字典被泄露了。

答案 1 :(得分:-1)

我不太了解iOS,但我发现你正在使用

NSString * key = (0 == it->first.length())?(@""):(@(it->first.c_str()));
NSString * value = (0 == it->second.length())?(@""):(@(it->second.c_str()));

但不知道发布它的位置。 对于每个循环,它将创建2个指针并且不会释放它。 我不知道我的意见是否正确,但我只看到那里。希望它会对你有所帮助。