Délégation Swift - quand utiliser le pointeur faible sur délégué
Quelqu'un peut-il expliquer quand et quand ne pas utiliser une assignation "faible" à un pointeur de délégué dans Swift, et pourquoi?
Ma compréhension est que si vous utilisez un protocole qui n'est pas défini comme une classe que vous ne souhaitez affecter à votre délégué pointeur de la faiblesse.
protocol MyStructProtocol{
//whatever
}
struct MyStruct {
var delegate: MyStructProtocol?
}
cependant, lorsque votre protocole est défini comme un protocole de type de classe, alors vous voulez mettre votre délégué sur un pointeur faible?
protocol MyClassProtocol:Class{
//whatever
}
class MyClass {
weak var delegate: MyClassProtocol?
}
Am - Je corriger? Dans le guide swift D'Apple, les exemples de protocole de classe n'utilisent pas des tâches faibles, mais dans mes tests, je vois des cycles de référence forts si mes délégués ne sont pas faiblement référencés.
3 réponses
vous rendez généralement les protocoles de classe (définis avec le mot-clé class
) faibles pour éviter le risque d'un" cycle de référence fort "(anciennement connu sous le nom de"cycle de conservation"). Ne pas rendre le délégué faible ne signifie pas que vous avez un cycle de référence fort, mais simplement que vous pourrait en avoir un.
avec les types struct
, bien que, le fort risque du cycle de référence est fortement diminué parce que les types struct
ne sont pas types "de référence", il est donc plus difficile de créer un cycle de référence solide. Mais si l'objet délégué est un objet de classe, alors vous pourriez vouloir faire du protocole un protocole de classe et le rendre faible.
à mon avis, rendre les délégués de classe faibles n'est que partiellement pour atténuer le risque d'un cycle de référence fort. C'est vraiment une question de "droit de propriété". La plupart des protocoles de délégation sont des situations où l'objet en question n'a pas d'entreprise revendiquant la propriété sur le délégué, mais simplement lorsque l'objet en question permet d'informer le délégué de quelque chose (ou d'en demander quelque chose).
les délégués devraient (éditer: généralement) toujours être faible.
laisse dire b
est le délégué de a
. Maintenant a
's delegate
propriété est b
.
Dans le cas où vous voulez b
à libérer lors de la c
est allé
si c
contient une forte référence à b
et c
désallocations, vous voulez b
pour désallouer avec c
. Cependant, l'utilisation d'une propriété de délégué forte dans a
, b
ne sera jamais désallouée puisque a
s'accroche fortement à b
. En utilisant une référence faible, dès que b
perd la référence forte de c
, b
sera dealloc quand c
deallocs.
Habituellement, il s'agit du comportement prévu, ce qui explique pourquoi vous voulez utiliser une propriété weak
.
protocol MyDelegate: class {
// ...
}
class MyViewController: UIViewController {
weak var delegate: MyDelegate?
}