Циркулярная ссылка ARC в target-c использует делегат - PullRequest
5 голосов
/ 16 февраля 2012

Hello!

Я пытался использовать делегата в своем приложении. Мой проект использует ARC

enter image description here

Например, у меня есть протокол X и два объекта, которые его используют. В объекте B я создал экземпляр для объекта A и установил делегат self (A.delegate = self) Во время выполнения я вызываю метод callBack (в этом пункте мой объект делегата B ). После этого все они выполняют метод -showResult .

В какой момент формируется круговая ссылка? Я понимаю, что это проблема со спецификатором strong , но я не понимаю, в какое время это произошло и как его отслеживать.

Спасибо!

Ответы [ 2 ]

14 голосов
/ 16 февраля 2012

Если два объекта поддерживают сильные ссылки друг на друга (то есть они сохраняют друг друга), у вас может быть так называемый «цикл сохранения».Ни один объект никогда не будет освобожден, потому что другой имеет сильную ссылку на него (сохраняет его), и поэтому он никогда не откажется от ссылки (освободит) другой объект.один объект (назовите его A) создает другой (B) и устанавливает себя в качестве делегата B.Если A имеет сильную ссылку на B, так что B не будет освобожден, а B также имеет сильную ссылку на A, у вас будет ссылочный цикл.Чтобы избежать этого, объекты обычно не сохраняют и не сохраняют строгие ссылки на своих делегатов.Сделайте ссылку Б на слабую вместо сильной, и проблема исчезнет.

1 голос
/ 16 февраля 2012

Похоже, вы держите строгую ссылку на A в B. Либо сделайте ее слабой ссылкой, либо - что является обычной практикой - сделайте делегата слабой ссылкой. В последнем случае вы должны установить delegate в nil для A, прежде чем освободить B.

...