stringWithContentsOfURL утечка памяти - PullRequest
1 голос
/ 30 августа 2009

Будет ли пролить больше света, если я скажу, что fetchHTML вызывается в отдельном потоке? Я также вижу несколько сообщений в консоли отладки, таких как:

_NSAutoreleaseNoPool (): объект 0xd92860 класса NSCFDictionary автоматически освобожден без пула на месте - просто утечка

_NSAutoreleaseNoPool (): объект 0xd92800 класса NSCFString автоматически освобожден без пула - только утечка

Я новичок в разработке приложений для iPhone, Objective-C, но не новичок в программировании или C / C ++. Я использую инструмент производительности утечки, и он показывает много утечек. Это утечка в 10,5 Кбайт, и это происходит на линии:

NSString * xml = [NSString stringWithContentsOfURL:urlobj];

Трассировка стека на этом ниже:

stringWithContentsOfURL
initWithContentsOfURL
initWithDataOfEncoding
...

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

Вот код функции:

- (NSString *) fetchHTML: (NSString* ) url{
    @try
    {
        NSURL* urlobj = [NSURL URLWithString:url];
        NSString * xml = [NSString stringWithContentsOfURL:urlobj];
        return xml;
    }
    @catch( NSException *ex){
        NSLog(@"Error fetchingHTML");
        return nil;
    }
    return nil;
}

Ответы [ 3 ]

1 голос
/ 30 августа 2009

Я полностью согласен с вами, что это не должно вызывать утечку. Я работаю в Cocoa / Objective-C уже 2 года, и похоже, что это должно сработать.

При этом я заметил, что в документации Apple указано, что метод stringWithContentsOfURL: считается устаревшим . Возможно, это будет работать следующим образом:

NSString * xml = [[NSString alloc]
                  initWithContentsOfURL:urlobj
                               encoding:NSASCIIStringEncoding
                                  error:nil];
return [xml autorelease];
1 голос
/ 31 августа 2009

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

Вы можете проверить NSAutoreleasePool docs для получения дополнительной информации о том, как работают стеки пула автоматического выпуска.

1 голос
/ 30 августа 2009

Да; это не должно протекать.

Это может быть ложным срабатыванием, так как подсистема URL кэширует содержимое URL и делает так, чтобы указатель больше не был виден для анализа утечек.

Если можете, повторите тест на Snow Leopard. Обнаружение утечек на Snow Leopard значительно быстрее и точнее.

...