0

Предположим, что у меня есть 2 класса, классы A и B. По составу класс A имеет экземпляр класса B. Иными словами, класс A является тем, который создает экземпляр класса B.Какой метод dealloc вызывается первым?

Если я ' m в окончательном выпуске моего объекта, который является своего рода классом A, будет ли сначала выполняться метод dealloc класса B? Это всегда так? Будет ли случай, когда dealloc класса A будет выполнен до класса B?

Я пытаюсь понять порядок, в котором будет выполняться метод dealloc классов.

(Это в АРК)

ответ

2

Если удалить (или, в реальном выражении, удалить последнюю сильную ссылку) экземпляр класса А, он будет быть освобожден. В ARC, как часть его освобождения, он удалит свою сильную ссылку на экземпляр класса B, который затем будет освобожден, если ничто иное не будет иметь к нему ссылки.

Итак, метод dealloc A называется первым.

Если вы в зависимости от этого порядка операций до do ничего, это довольно плохой запах кода.

+1

И детали gory здесь: http: // clang.llvm.org/docs/AutomaticReferenceCounting.html#dealloc. В частности: «Переменные экземпляра для класса, скомпилированного ARC, будут уничтожены в какой-то момент после того, как управление войдет в метод dealloc для корневого класса класса». –

+0

oh. поэтому A будет вызываться первым, но B будет освобожден до A. как насчет кода внутри функций dealloc? Так как метод dealloc A вызывается первым, означает ли это, что код внутри dealloc A будет выполнен до B? Ох. Я просто хочу глубоко понять dealloc. большое спасибо за ответ. – cessmestreet

+2

* «B будет освобожден до завершения метода dealloc A» *, возможно, немного вводит в заблуждение. B будет освобожден до завершения операции освобождения A. Но если оба A и B предоставляют метод 'dealloc', сначала будет вызываться метод A. По крайней мере, так я понимаю: «Класс может предоставить определение метода для метода экземпляра с именем dealloc. Этот метод будет вызываться после окончательной версии объекта, но до его освобождения или уничтожения любой из его переменных экземпляра». –

1

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

Другими словами, если А принадлежит В, то А будет освобождаться, прежде чем B.

+0

_remove_? Вы, конечно, имели в виду _release_;) – CouchDeveloper

+0

Я намеренно использовал более абстрактное слово, чтобы сфокусироваться на семантике операции «избавление от ссылки», а не на механизм «декрементации refcount» –

Смежные вопросы