Использование объектов autoReleased без NSAutoReleasePool? - PullRequest
1 голос
/ 23 июня 2011

Я пишу свои первые шаги в Objective-C.
Я следовал за некоторыми примерами и официальной документацией, и использую автоматически выпущенные объекты * без явного объявления NSAutoReleasePool.

* Под автоматически выпущенными объектами я имею в виду: SomeClass *obj = [SomeClass someClass];

Можно ли так делать?
Это вызовет проблемы с памятью?
Является ли объявление NSAutoReleasePool более эффективным?

edit: я допустил ошибку в примере кода, я имел в виду получение объекта его методом фабрики классов вместо alloc его экземпляра. Методы этой фабрики [часто | всегда] возвращают автоматически освобожденные объекты, верно? например: [NSString stringWithCString:x]

Ответы [ 2 ]

6 голосов
/ 23 июня 2011

Обычно вам не нужно явно создавать пул автоматического выпуска.Когда вы выполняете обычное программирование на Mac с использованием инфраструктуры AppKit, будет создан неявный пул автоматического выпуска, который обрабатывается циклом событий.Вам нужно заниматься пулами автоматического выпуска в основном в двух случаях:

  • Ваш код выполняется в фоновом потоке: если у вас есть фоновый поток, для вас не создан пул автоматического выпуска, и вам придется сделатьэто вручную.
  • У вас есть тесная петля, в которой вы создаете и уничтожаете множество объектов.Если в этом цикле какие-либо объекты автоматически высвобождаются, они фактически не будут освобождены до тех пор, пока пул автозапуска не будет слит.Это означает, что ваше потребление памяти возрастет, даже если вы больше не ссылаетесь на эти объекты.В этой ситуации наличие локального пула автоматического выпуска может помочь с производительностью, хотя переключение с автоматического выпуска на явное сохранение / освобождение, вероятно, более эффективно.
1 голос
/ 23 июня 2011

В ответ на ваш вопрос: это нет-нет.Вы потеряете память, если вы автоматически высвобождаете объект (или используете автоматически высвобождаемый объект) в области, в которой нет пула автоматического высвобождения.

возможно, игнорируйте следующее:

Что касается вашего примера, это можетзапутайте, как вы это написали, поскольку Class - это typedef, равный struct objc_class*.Итак, вы действительно объявляете указатель на указатель на класс, а затем назначаете ему указатель на класс.Который не будет работать.Более того, поскольку Class не является «типом класса» Objective-C как таковым, вы не можете отправлять ему сообщения.Но всего этого нет ни здесь, ни там, поскольку ±class не возвращает автоматически выпущенный объект.

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