2010-01-30 2 views
1

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

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

NSXMLDocument* undoXML;
NSData* undoData = [NSData dataWithContentsOfFile:undoFilePath];
undoXML = [[NSXMLDocument alloc] initWithData:undoData options:NSXMLDocumentTidyXML error:&err];

NSData* undoData2;
undoData2 = [undoXML XMLData];

[undoData2 release];
[undoXML release];

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

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

NSData* undoData3;
undoData3 = [undoXML XMLData];
[undoData3 release];

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

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

+1

странно, что это происходит, так как вы слишком много выпускаете, не слишком мало (undoData2 автореализован, поэтому вы не должны его отпускать) – cobbal

ответ

2

Уверен, что это утечка? Или это просто растет?

Как выглядит ваша петля и как интегрируется пул авторефератов?

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

1

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

Run -> Run With Performance Tool -> Утечки

+0

В нем не сообщается никаких утечек. – Chetan

+0

Странный вопрос, но ваш проект позволяет сборку мусора Objective C? Mac, iPhone, iPod или iPad? – pestilence669

+0

Если у вас нет утечек, почему вы говорите (в исходном вопросе), что он протекает? – gary

-2

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

+0

Если NSData имеет утечки, все iPhone будут взорваться. – pestilence669

0

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

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

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

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

    // do stuff that produces autoreleased objects 

    [pool drain]; 
} 

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

+0

Он рухнет, если он удвоится, нет? Я все еще думаю, что он включил сбор мусора. – pestilence669

Смежные вопросы