2009-11-16 2 views
0

Это вопрос из другого вопроса, мой вопрос касается использования сохранения/выпуска в main(). Из моего понимания в этом простом примере заявления сохранения/освобождения не нужны. НО в более сложных ситуациях лучше всего их добавить, так как это гарантирует, что экземпляр планеты не будет выпущен неожиданно.Управление памятью экземпляра объекта

+(Planet *) planet { 
    gPlanetCount++; 
    //return [[[Planet alloc] init] autorelease]; 
    return [[[self alloc] init] autorelease];  // Better 
} 

int main(int argc, const char * argv[]) { 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 

    Planet *outerMost; 

    outerMost = [[Planet planet] retain]; 
    ... 
    ... some code 
    ... 
    [outerMost release]; 
    [pool drain]; 
    return 0; 
} 

EDIT_001

Так что я мог бы лучше написать выше, как.

int main(int argc, const char * argv[]) { 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 

    Planet *outerMost; 

    outerMost = [Planet planet]; 
    ... 
    ... some code 
    ... 
    [pool drain]; 
    return 0; 
} 

веселит комментарий ГАРИ

+1

Код управления памятью представляется правильным, но вы можете добавить NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; как первая строка вашей основной функции. Вы, наверное, только забыли оставить это в своем фрагменте, когда вы сливаете бассейн в конце. –

+0

Markus, я добавлю, что прямо сейчас для правильности, у меня это в моем коде, я просто забыл добавить его здесь, спасибо, что указал на это. – fuzzygoat

+0

Я никогда не видел использования [self alloc] в методе уровня класса. Это работает? Я думал, что «я» зарезервировано для экземпляров классов. – rein

ответ

3

Маркуса Мюллера является правильным, то есть, ваш код является правильным, недостающим выделением пула и инициализации, за исключением.

Однако, если вы создаете автореализованный объект в методе/методе и используете этот объект в этой процедуре/методе, и вы закончите с ним, перед тем как выйти из этой процедуры/метода, тогда нет причин для сохраните его, а затем отпустите. Гарантируется, что этот объект будет сохранен на весь срок службы подпрограммы/метода, и в этом случае он, скорее всего, будет освобожден методом [пула стока].

У вас не будет ситуации, когда наружная версия выпущена неожиданно. Ожидаемый выпуск находится в [пул дренажа]. Неважно, сколько других методов вызывается из main(), если вы придерживаетесь рекомендаций по сохранению/выпуску, outerMost не нужно будет сохранять.

+0

А я вижу, так бы вы считаете EDIT_001 лучшим способом написать это? – fuzzygoat

+0

fuzzygoat: Да, поскольку вы не нуждаетесь в сохранении и освобождении объекта. До тех пор, пока вы не делаете очень забавные вещи с другими пулами автозапуска, автореферат не наступит, пока вы не слейте пул, созданный вами в 'main'. –

+0

Спасибо, Питер. – fuzzygoat

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