Подтвердить что ты не робот

Objective-C управление памятью autorelease

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

После чтения Об управлении памятью в Mac Developer Library я понял, что когда у вас есть метод, который действует как метод factory - по создавая новый объект и возвращая его - метод не имеет способа освободить объект перед его возвратом, потому что это приведет к возврату возвращаемого объекта.

Пример

- (Test *) createNewTest 
{
    Test *newInstance = [[Test alloc] init];
    [newInstance release];
    return newInstance; // deallocted object returned.
}

Вместо этого я должен использовать autorelease:

Метод автоопределения, определенный NSObject, отмечает приемник для последующего выпуска

Мой вопрос: если объект должен быть выпущен позже, как узнать, когда он будет выпущен?

- (Test *) createNewTest 
{
    Test *newInstance = [[test alloc] init];
    [newInstance autorelease];
    return newInstance;
}

- (void) runIt
{
    Test *myInstance = [self createNewTest];
    // when is myInstance released?? and thereby not valid to my function anymore?
}

Как я могу безопасно использовать возвращенный объект с автореализацией внутри моего метода runIt, если я не знаю, когда происходит автоматическое оповещение? Должен ли я сохранить объект, возвращенный createNewTest? Или я могу безопасно использовать его в пределах runIt?

4b9b3361

Ответ 1

Автореализованный объект добавляется в пул авторекламы.

Объекты в пуле автономии освобождаются в конце итерации основной runloop (или раньше, если вы управляете своим собственным пулом автозапуска и/или если вы вызываете дренаж).

Когда вы вызываете метод, возвращающий объект с автореализацией, он в значительной степени гарантированно остается действительным до тех пор, пока, по крайней мере, конец области, в которую он был вызван.

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

Ответ 2

Как я могу безопасно использовать возвращенные автореализованный объект внутри моего runIt метод, если я не знаю, когда авторезистор?

Автореферат запускается после окончания текущего цикла цикла.

Должен ли я сохранить объект, возвращенный createNewTest? или я могу безопасно использовать его в пределах области runIt?

Вы можете безопасно использовать его в области runIt.

Ответ 3

Лучше сохранить объект и освободить его после использования.

Ответ 4

Тот, кто отвечает за его создание, и тот, кто вызывает runIt, должен сохранить объект. Когда один ответственный с ним выполняется, он должен затем освободить объект.