Управление памятью экземпляра объекта - PullRequest
0 голосов
/ 16 ноября 2009

Это продолжение другого вопроса, мой вопрос касается использования retain / release в 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 Ответ

3 голосов
/ 16 ноября 2009

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

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

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

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