[a retain]
в объекте брелиз называется по круговой ссылке
в объекте А
[b retain]
в результате циклической ссылки. Что произойдет, если [a release]
Вызывается каким-либо методом в объекте b?
[a retain]
в объекте брелиз называется по круговой ссылке
в объекте А
[b retain]
в результате циклической ссылки. Что произойдет, если [a release]
Вызывается каким-либо методом в объекте b?
Если какой-либо метод в b
вызовах [a release]
, то сохранить цикл нарушается. Когда ничего не принадлежит a
, a
будет освобожден. Предположительно, в a
dealloc
, он [b release]
. Тогда, если ничего не принадлежит b
, b
также будет освобожден.
Иногда цикл сохранения в порядке. Вам просто нужно убедиться, что цикл будет нарушен в соответствующее время. Например, объект может владеть одноразовым NSTimer
, а таймер может владеть объектом (как target
), создавая цикл сохранения. Когда срабатывает таймер, объект должен отпускать таймер, прерывая цикл удержания. Если объект отменяет таймер (отправив его invalidate
) до срабатывания таймера, таймер освобождает объект, также нарушая цикл сохранения.
Вы создали цикл удержания в таком случае, которого следует избегать, поскольку это является формой утечки памяти.
Вот хороший подправить: http://www.cocoawithlove.com/2009/07/rules-to-avoid-retain-cycles.html
Я бы настоятельно рекомендовал перепроектирование классов, чтобы избежать кругового требования,