возврат автозапуска NSString по-прежнему вызывает утечки памяти - PullRequest
3 голосов
/ 28 марта 2010

У меня есть простая функция, которая возвращает 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];  

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

Ответы [ 2 ]

5 голосов
/ 28 марта 2010

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

0 голосов
/ 28 марта 2010

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

...