Может кто-нибудь объяснить различия между free()
, release
, autorelease
и dealloc
?
Каковы различия между бесплатным, dealloc, выпуском и авторекламой?
Ответ 1
free()
- это функция C, которую вы используете, чтобы избавиться от ненужной памяти, которую вы получили с помощью malloc()
или другой функции, которая документирована, чтобы требовать, чтобы free() освобождал свою память, например. strdup()
.
-dealloc
- селектор Objective-C, который отправляется при выполнении Objective-C среды выполнения объекта, когда объект больше не принадлежит какой-либо части приложения.
-release
- это селектор, который вы отправляете объекту, чтобы указать, что вы отказываетесь от владения этим объектом. Когда объект не принадлежит кому-либо, он отправляет сообщение -dealloc
по времени выполнения.
-autorelease
- это селектор, который вы отправляете объекту, чтобы указать, что вы отказываетесь от владения объектом. Однако, если теперь никто не владеет объектом, окончательный -dealloc
будет отложен до некоторой неопределенной более поздней точки. Фактически, то, что вы на самом деле делаете, это передача вашего права собственности в пул автозапуска, который затем выйдет из него, когда он сам будет выпущен (или разряжен).
Вы никогда не должны отправлять -dealloc
объекту, кроме super
в собственный метод -dealloc
объекта.
Ответ 2
Из 4 описанных вами методов вы обычно используете только release
и autorelease
в objective-c. free
может использоваться, когда вы использовали c и malloc
, иначе вы должны использовать release
и autorelease
.
dealloc
не должен вызываться каким-либо вашим кодом, так как он может помешать циклу сохранения/освобождения, который objective-c использует для отслеживания ресурсов. Использование dealloc
почти наверняка приведет к сбоям во время выполнения, если вы когда-либо используете его.
Конечным ресурсом использования release
и autorelease
является Документация по управлению памятью Apple
Ответ 3
-
free
является противоположностьюmalloc
и используется в C. Вероятно, вы не будете использовать его очень много программирования в Objective C - Если у вас есть объект, вы
release
его, когда закончите с ним - Вы также можете
autorelease
объект. Это автоматически освобождает его в конце текущей итерации цикла выполнения. - Когда счетчик ссылок на объект падает до нуля, среда выполнения вызывает
dealloc
. Вы не должны сами называть этот метод.
Вы "владеете" объектом, если вы alloc
, new
, retain
или copy
его.
Apple предоставляет хорошую документацию на этом.