Objective-C управление памятью странные результаты - PullRequest
1 голос
/ 30 января 2010

Я вызываю функцию несколько раз с циклом, и цикл выполняется внутри потока. В теме есть пул авто-релизов.

У меня есть следующий код внутри этой функции:

NSXMLDocument * undoXML;
NSData * undoData = [NSData dataWithContentsOfFile: undoFilePath];
undoXML = [[NSXMLDocument alloc] initWithData: параметры отмены данных: NSXMLDocumentTidyXML error: & err];

NSData * undoData2;
undoData2 = [undoXML XMLData];

[отмена версии2];
[отмена выпуска XML];

Я получаю следующие странные результаты:

  • Моя программа теряет память каждый раз, когда эта функция вызывается циклом.
  • Когда я добавляю следующий код в функцию:

NSData * undoData3;
undoData3 = [undoXML XMLData];
[отмена выпуска 3];

Моя программа пропускает еще больше памяти, чем раньше.

Я действительно запутался и мне очень нужна помощь, чтобы выяснить, что происходит. Может быть, мой пул авто-релизов работает неправильно? Почему это происходит?

Ответы [ 4 ]

2 голосов
/ 30 января 2010

Вы уверены, что это утечка?Или он просто увеличивается в размере?

Как выглядит ваш цикл и как в него интегрирован пул авто-релиза?

Пул авто-релиза должен быть внутри цикла, иначе ваш цикл будет просто создандо тонны памяти с течением времени.То, что инструмент утечки не показывает утечки, указывает на то, что вы нарушили правила управления памятью или ваш цикл неправильный.

1 голос
/ 30 января 2010

Попробуйте запустить Instruments в вашем проекте с настройками обнаружения утечек. Это должно точно определить, где происходит утечка (даже в системных библиотеках).

Выполнить -> Выполнить с помощью инструмента повышения производительности -> Утечки

0 голосов
/ 30 января 2010

undoData должен быть предварительно установлен для автоматического освобождения (согласно соглашению об именах dataWithContentsOfFile: возвращает объект автоматического освобождения). Но если у вас нет собственного пула автоматического выпуска, то все, что установлено как автоматическое освобождение, фактически не будет освобождено до тех пор, пока активный пул не будет удален (т.е. через некоторое время после возврата вашей функции).

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

Если вы хотите инициировать слив автоматически выпущенных объектов в середине функции (скажем, один раз за цикл), вам нужно управлять собственным пулом автоматического выпуска.

while(looping) {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    // do stuff that produces autoreleased objects

    [pool drain];
}

Кроме того, согласно комментарию cobbal к вашему вопросу, похоже, что вы не должны выпускать undoData2 (или undoData3). В соответствии с соглашением об именах -[NSXMLDocument XMLData] должен возвращать автоматически освобожденный объект.

0 голосов
/ 30 января 2010

Если у вас есть доступ к исходному коду класса NSData, вы должны посмотреть, какие объекты создаются при создании undoData3. Я говорю это, потому что вы создаете объект и немедленно уничтожаете его. Проблема должна заключаться в том, что память распределяется внутри класса, но не освобождается в его деструкторе.

...