Почему этот код Objective C выделяет ГБ ОЗУ, освобождает его позже и не сообщает о каких-либо утечках? - PullRequest
1 голос
/ 30 мая 2011

Я унаследовал некоторый код, и он выглядит так:

- (bool)makeOneLevel:(int)nummines objects:(int)numobjects
{
    [field release];
    state = gameWait;
    field = [[MineField alloc] createLevel:nummines objects:numobjects];

    if([field rating] == -1)
    {
        return false;
    }
...

Всегда выделяется один MineField.Всякий раз, когда вы создаете новое поле, функция, в первую очередь, освобождает старое.Если функция преуспевает в создании MineField, то она возвращает true.

У меня также есть это:

while(numsaved < self.makeNumber)
{
    while(![mineView makeOneLevel:self.makeNumMines objects:self.makeNumObjects])
    {
    }
    { 
        //saving code here
    }
    numsaved++;
}

, которая вызывает функцию, пока не создаст действительное MineField.Это все работает.Но при этом он выделяет ГБ ОЗУ.Но инструмент «Утечки» не обнаруживает утечек, и когда внешнее время завершается, и ОС возвращает контроль, вся эта оперативная память освобождается очень хорошо.

Я делаю что-то не так с распределением MineField, или я должен искатьв другом месте в процессе создания?

Ответы [ 2 ]

6 голосов
/ 30 мая 2011

Не зная внутренностей, невозможно сказать наверняка, но описываемое вами поведение звучит как -[MineView makeOneLevel:objects:] - это внутреннее размещение и автоматическое освобождение объектов. Поскольку цикл событий AppKit по умолчанию создает и очищает пул автоматического выпуска для каждого обрабатываемого события, в конечном итоге все в конечном итоге исчезает, но не до тех пор, пока не завершится обработка события (например, после выхода из вашего метода).

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

0 голосов
/ 30 мая 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...