Отнесение удерживаемого объекта к слабому имуществу; объект будет освобожден после назначения

Я написал на Xcode6 пример шаблона делегирования Objective-C в Википедии. Каждый раз, когда вы устанавливаете делегата, появляется предупреждение «Назначение удерживаемого объекта слабому свойству; объект будет освобожден после назначения». После запуска примера методы f и g класса A не выполняются. Изменение линии

@property (слабое, неатомарное) id i; // делегирование

to

@property (сильное, неатомарное) id i; // делегирование

решить проблему. Почему это?


person joan    schedule 01.03.2015    source источник


Ответы (1)


Как правило, в шаблоне делегата ссылка должна быть слабой, поскольку она ссылается на делегат, который является сильным свойством другого объекта. Поскольку они, как правило, не принадлежат объекту со свойством delegate (в вашем примере i), вы не хотите сохранять на них сильную ссылку. На самом деле, довольно часто у вас будет объект, такой как контроллер окна (или контроллер навигации в iOS), которому принадлежит объект (например, какой-либо элемент управления), чей делегат вы хотите вернуть контроллеру окна. (или навигационный контроллер).

В этом случае вам нужно, чтобы ссылка delegate была слабой, чтобы предотвратить цикл сохранения (в противном случае оконный контроллер владеет ссылкой на элемент управления, который владеет ссылкой на оконный контроллер в качестве делегата).

Итак, в приведенном выше примере вам лучше изучить эту концепцию, используя более реальный пример, где сам делегат сохраняется другим объектом, что более точно отражает способ использования делегатов в дикой природе.

person gaige    schedule 01.03.2015