Если вы хотите иметь хорошо продуманный код, для начала вам нужно избежать этой проблемы. Например, освобождайте родительский объект только после завершения всей его дочерней работы или помещайте код выпуска в блок обработчика завершения, который будет вызываться только тогда, когда дочерний метод не выполняется.
Однако быстрое исправление - это то, что сказал babbidi, или это, если вы используете ARC: сохраните сильную ссылку на родителя в локальной переменной, скажем, localParent
, в начале метода. Это создает цикл сохранения и, следовательно, ни один из объектов не будет освобожден. Поскольку localParent
является локальным, он автоматически освобождается в конце метода, прерывая цикл сохранения и позволяя освободить оба объекта.
Если ваш метод имеет возвращаемое значение, используйте локальный родительский элемент в асинхронном блоке для эффективной имитации поведения автоматического выпуска:
dispatch_async(dispatch_get_main_queue(), ^{
[localParent self]; // this does nothing
});