Вопрос о времени жизни объекта фабричного метода в Objective-C / Какао (сохранить или нет ...) - PullRequest
3 голосов
/ 07 января 2010

Изучив документы по управлению памятью в SDK, я понял, что фабричные методы (статические методы конструктора) обычно сохраняют объект для меня и добавляют его в пул автоматического выпуска?

Это означало бы, что мне не нужно сохранять и освобождать объект, если пул не освобождается раньше, чем я ожидаю? (Что должно быть в конце приложения для пула автоматического выпуска по умолчанию в main ()?)

Этот вопрос: Какао Touch Touch Вопрос. Следует ли сохранять [массив NSMutableArray]? , похоже, согласен с этим.

Однако, когда я использовал NSMutableArray arrayWithCapacity: метод, я обнаружил, что должен сохранить массив, или все хек-хенды потеряются.

Я уверен, что все это просто n00b-ness или странная ошибка в другом месте кода, но если бы кто-то мог объяснить, как именно я мог неправильно понять, я был бы очень признателен.

Спасибо!

Обновление: спасибо за ответы. Я думаю, что у меня есть это сейчас!

Ответы [ 4 ]

8 голосов
/ 07 января 2010

Из чтения документации по управлению памятью в SDK я понял, что фабричные методы (статические методы конструктора) обычно сохраняют объект для меня и добавляют его в пул автоматического выпуска?

Да, вам не нужно беспокоиться о освобождении объектов, возвращаемых любым методом, кроме методов alloc, init, new и copy.

Это будет означать, что мне не нужно сохранять и освобождать объект, если пул не освобождается раньше, чем я ожидаю?

Да.

(Что должно быть в конце приложения для пула автоматического выпуска по умолчанию в main ()?)

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

Если вы хотите, чтобы экземпляр объекта выживал за пределами текущего метода, вы должны стать его владельцем, вызвав 'retain'. Затем вы также несете ответственность за «освобождение» экземпляра, когда он вам больше не нужен.

В вашем случае, если вы хотите, чтобы ваш NSMutableArray оставался без присмотра, вам нужно retain его. Еще лучше, используйте [[NSMutableArray alloc] initWithCapacity: ];

См. Практическое управление памятью

4 голосов
/ 07 января 2010

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

Итак, когда вы создаете NSMutableArray как объект с автоматическим выпуском, после завершения метода все ставки отключаются, и этот пул автоматического выпуска может истощаться в любое время. Сохраните его, а затем отпустите в своем дольке.

1 голос
/ 07 января 2010

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

Этот цикл событий поддерживает пул автоматического выпуска верхнего уровня. В псевдокоде этот цикл событий будет выглядеть примерно так:

while(wait for event) {
    1) create autorelease pool
    2) handle event
    3) release pool
}

Таким образом, всякий раз, когда событие обрабатывается, управление возвращается к основному циклу событий, и этот внешний пул освобождается. Вы должны сохранить все объекты, которые были созданы с использованием удобных методов и будут необходимы даже после завершения обработки событий. С дополнительным счетом сохранения вы вступаете во владение объектом и несете ответственность за его освобождение, когда он больше не нужен.

Приложение для iPhone http://developer.apple.com/iphone/library/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/Art/app_life_cycle.jpg

0 голосов
/ 07 января 2010

Как только вы добавляете ваш объект в массив, существует неявный вызов для сохранения этого объекта, что означает, что после добавления в массив вы можете освободить его из источника, а когда вы вызовете метод remove из В массиве также будет неявный вызов release.

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