Каковы различия между свободным, dealloc, выпуском и автовыпуском?

Может кто-то объяснять различия между free(), release, autorelease и dealloc?

16
задан Vadim Kotov 17 August 2017 в 13:07
поделиться

3 ответа

free() - это функция языка Си, которую вы используете для утилизации ненужной памяти, полученной через malloc() или другую функцию, которая, согласно документации, требует free() для деаллокации памяти, например. например, strdup().

-dealloc - это селектор Objective-C, который посылается средой выполнения Objective-C объекту, когда объект больше не принадлежит какой-либо части приложения.

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

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

Вы никогда не должны посылать -dealloc объекту, кроме как super в собственном методе -dealloc объекта.

18
ответ дан 30 November 2019 в 21:45
поделиться
  • free является противоположностью malloc и используется в C. Скорее всего, вы не будете часто использовать его при программировании на Objective C
  • Если вы владеете объектом, вы освобождаете его, когда закончите с ним
  • Вы также можете autorelease объект. Это автоматически освобождает его в конце текущей итерации цикла выполнения
  • Когда количество ссылок на объект падает до нуля, время выполнения вызывает dealloc. Вы не должны вызывать этот метод самостоятельно

Вы "владеете" объектом, если вы alloc, new, retain или copy его.

Apple предоставляет хорошую документацию по этому вопросу.

3
ответ дан 30 November 2019 в 21:45
поделиться

Из 4 методов, которые вы упомянули, вы обычно используете только release и autorelease в objective-c. free может быть использован, когда вы использовали c и malloc , в противном случае вам следует использовать релиз и autorelease .

dealloc не должен вызываться каким-либо кодом, так как он может мешать циклу сохранения / освобождения, который объект-c использует для отслеживания ресурсов. Использование dealloc почти наверняка приведет к сбоям во время выполнения, если вы когда-нибудь его используете.

Основным источником использования выпуска и автоматического выпуска является документация Apple по управлению памятью

3
ответ дан 30 November 2019 в 21:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: