Утечки памяти на 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 указателя и не освобождает его. Я не знаю, правильное мое мнение или нет, но я вижу только там. Надеюсь, это поможет вам.