Каковы различия между free, dealloc, release и autorelease? - PullRequest
16 голосов
/ 26 июля 2010

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

Ответы [ 3 ]

18 голосов
/ 26 июля 2010

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

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

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

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

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

3 голосов
/ 26 июля 2010
  • free является противоположностью malloc и используется в C. Вы, скорее всего, не будете использовать его в программировании в Objective C
  • . Если вы владеете объектом, вы release это, когда вы закончите с этим
  • Вы также можете autorelease объект.Это автоматически освобождает его в конце текущей итерации цикла выполнения
  • Когда счетчик ссылок на объект падает до нуля, среда выполнения вызывает dealloc.Вы не должны вызывать этот метод самостоятельно

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

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

3 голосов
/ 26 июля 2010

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

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

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

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