возврат автозапуска NSString по-прежнему вызывает утечку памяти

У меня есть простая функция, которая после декодирования возвращает NSString. Я часто использую его в своем приложении, и каждый раз, когда я его использую, создается утечка памяти (согласно инструменту «утечки»). Утечки говорят мне, что проблема в строке, где я выделяю NSString, который собираюсь вернуть, хотя я автоматически освобождаю его. Вот функция:

-(NSString *) decodeValue
{
 NSString *newString;
 newString = [self stringByReplacingOccurrencesOfString:@"#" withString:@"$"];
 NSData *stateData = [NSData  dataWithBase64EncodedString:newString];
 NSString *convertState = [[[NSString alloc] initWithData:stateData encoding:NSUTF8StringEncoding] autorelease];
 return convertState;
}

Насколько я понимаю, [autorelease] должен использоваться именно таким образом ... где я хочу удерживать объект достаточно долго, чтобы вернуть его в моей функции, а затем позволить объекту автоматически освобождаться позже. Поэтому я считаю, что могу использовать эту функцию с помощью такого кода, не выпуская ничего вручную:

NSString *myDecodedString = [myString decodeValue];  

Но этот процесс сообщает об утечках, и я не понимаю, как его изменить, чтобы избежать утечек. Что я делаю неправильно?


person hookjd    schedule 28.03.2010    source источник


Ответы (2)


Я думаю, что утечки сбивают вас с пути. Утечки сообщат вам, где изначально был размещен объект утечки, не обязательно то же самое, что и причина утечки. Этот код кажется прекрасным - вероятно, происходит то, что этот результат где-то сохраняется в другом классе и никогда не публикуется там.

person jexe    schedule 28.03.2010
comment
Спасибо. Итак, если я правильно понимаю вас и starkhalo, утечки говорят мне, что объект выделен в моей функции, и даже если он настроен на автозапуск, он каким-то образом сохраняется любым кодом, вызывающим этот вызов функции где-то . Это разумная интерпретация того, что вы говорите? - person hookjd; 28.03.2010
comment
Ага! Точно. Проверьте, какой код вызывает это, и убедитесь, что он освобождает возвращаемое значение, если оно сохраняется. - person jexe; 29.03.2010

Jexe прав, инструмент Leaks не может знать, где находится утечка, все, что он знает, - это точка создания экземпляра и то, что в конце RunLoop указанный объект все еще сохранялся, поэтому он указывает на вызов alloc. Это все еще большая помощь, теперь вам просто нужно выяснить, у кого еще есть доступ к convertState и он сохраняет его.

person Hellektor    schedule 28.03.2010