iOS: Dealloc не вызывается, если для сильного делегата установлено значение self

Скажем, у меня есть класс (скажем, «MyClass») типа UIView, где я объявил свойство типа (nonatomic, strong) для делегата класса, чтобы обрабатывать события, которые будут запускаться классом.

Приложение поддерживает ARC, и оно работает просто отлично, когда я нашел кое-что интересное, я поместил Dealloc в один из моих контроллеров представления (скажем, TempViewController), где я устанавливаю делегата от MyClass до self. Всякий раз, когда я выталкиваю из TempViewController, он должен вызывать свой метод Dealloc, но это не так. Я не знаю почему, но это не так, я ставлю сделки для других классов, и все они вызываются.

Затем я обнаружил, что он не вызывает TempViewController, потому что я установил делегата MyClass. Я тестирую то же самое и с другими классами, и тогда он перестает вызывать Dealloc.

Позже я меняю, делегирую свойство assign вместо strong, хотя оно снова работает нормально.

Еще одно решение, которое я нашел, заключается в том, что, установив nil в viewDidDisappear для делегата MyClass (как мы сделали для MKMapView или UIWebView), он вызовет Dealloc для того же класса TempViewController.

Что вызывает проблему? Любая помощь, предложение?


person Hemang    schedule 30.12.2013    source источник
comment
Проблема в том, что вы создаете ссылочный цикл, в котором объект ссылается на себя через свое свойство делегата. Вам нужно либо объявить своего делегата слабым, либо разорвать цикл, установив для делегата значение nil.   -  person yurish    schedule 30.12.2013


Ответы (3)


Если вы дадите сильное свойство своему делегату, это увеличит количество удержания. Когда вы выходите из очереди навигации, это также просто уменьшает количество сохранений. Таким образом, несмотря на то, что you pop ваш контроллер представления, он сохраняет счет через делегата (если он сильный). Ваш Dealloc получает вызов только тогда, когда счетчик удержания равен 0

Примечания. Когда вы устанавливаете nil для делегирования в Disappear, назначенный вами делегат decrease сохраняет счет через setter method и назначает nil для делегирования. Вот почему он получает вызов, когда установлен ноль.

Таким образом, вы можете объявить, что вы делегируете как weak, например

@property (nonatomic, weak) id<Protocol> delegate;
person Mani    schedule 30.12.2013

Это также означает, что вы все еще держите или ссылаетесь на свойство другого класса, и компилятор не может вызвать метод Dealloc для этого класса. либо вы устанавливаете его на ноль, если все готово, либо назначаете ему слабую ссылку. попробуйте также прочитать этот ответ

person Joshua    schedule 30.12.2013

Это потому, что вы объявили свойство как strong, измените его на weak.

@property (nonatomic, weak) id<yourprotocol> delegate;
person Midhun MP    schedule 30.12.2013