Утечки памяти на iOS6, преобразовывающие std::map в NSDictionary

Я пишу метод для преобразования 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 Forum: https://devforums.apple.com/message/1114878

2 ответа

Из того, что вы сказали, похоже, что возвращенный словарь просочился.

Я не так много знаю iOS, но я вижу, что вы используете

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

но не вижу, где это выпустить. Для каждого цикла он создает 2 указателя и не освобождает его. Я не знаю, правильное мое мнение или нет, но я вижу только там. Надеюсь, это поможет вам.

Другие вопросы по тегам