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
?
Ответы
Ответ 1
Автореализованный объект добавляется в пул авторекламы.
Объекты в пуле автономии освобождаются в конце итерации основной runloop (или раньше, если вы управляете своим собственным пулом автозапуска и/или если вы вызываете дренаж).
Когда вы вызываете метод, возвращающий объект с автореализацией, он в значительной степени гарантированно остается действительным до тех пор, пока, по крайней мере, конец области, в которую он был вызван.
Если вы хотите, чтобы он оставался живым дольше, вы должны сохранить его, не забывая его снова выпустить, когда закончите с ним.
Ответ 2
Как я могу безопасно использовать возвращенные автореализованный объект внутри моего runIt метод, если я не знаю, когда авторезистор?
Автореферат запускается после окончания текущего цикла цикла.
Должен ли я сохранить объект, возвращенный createNewTest? или я могу безопасно использовать его в пределах области runIt?
Вы можете безопасно использовать его в области runIt.
Ответ 3
Лучше сохранить объект и освободить его после использования.
Ответ 4
Тот, кто отвечает за его создание, и тот, кто вызывает runIt, должен сохранить объект. Когда один ответственный с ним выполняется, он должен затем освободить объект.