-2
votes

Pourquoi les points de vente sont-ils déclarés comme faibles?

J'ai regardé ce sujet sur Google, mais je n'ai pas encore de réponse compréhensible, le problème est que je sache que lorsque deux classes sont couplées ensemble en instanciant d'un objet dans la première classe de la deuxième classe et déclarant un autre objet dans le Deuxième classe de la première classe Ceci provoquera un cycle de conservation qui devrait être rompu en utilisant le mot-clé faible ou évident, mais je ne peux pas appliquer cette façon de penser sur les Iboutlets déclaré comme faibles Par exemple

class SignUpViewController: UIViewController {
 override func viewDidLoad() {
        super.viewDidLoad()
    }
@IBOutlet weak var signUpBttn: UIButton!
}


4 commentaires

Ceci est discuté ici


@ Reinhardmänner Je suis tombé sur cet article mais tout est toujours vague pour moi: s


Les points de vente ne sont pas déclarés faibles "par défaut" afin que toute la prémisse de la question est fausse.


Cependant, une ligne de pensée pourrait exécuter: le contrôleur d'affichage a une référence forte à sa vue. La vue a une référence forte à sa sous-vision. Avons-nous vraiment besoin d'une autre référence forte du contrôleur d'affichage à la sous-vision? Qui possède la sous-sousview quand même? Son superview.


3 Réponses :


1
votes

Tous les éléments UI dans un contrôleur d'affichage font partie de la vue ViewController. Donc, la vue est une classe UIView et des points de vente sont en référence dans la vue Contentrale des éléments de la classe UIView, de sorte que la vue est supprimée, la hiérarchie de la vue Tous les éléments croisés doivent être faibles pour éviter toute référence croisée. Le problème de l'EID à ce sujet est la référence d'Apple MVC, où une entreprise de vue est un contrôleur, mais a un groupe associé à la partie de vue. Toutes les points de vente doivent être placés dans la classe UIView de votre vie de ViewController.


0 commentaires

0
votes

TLDR - à mon avis Ce n'est pas une bonne décision.

A forte référence dénote la propriété. Le contrôleur View ou View est le propriétaire des vues, par conséquent, le choix logique devrait être fort .

Cependant, dans la plupart des situations, cela n'a pas vraiment d'importance car les vues sont également fermement référencées. par leur parent dans la hiérarchie de vue.

Quand est-ce important? Il est important dans des situations lorsque vous mettez à jour de manière dynamique la hiérarchie d'affichage en supprimant les vues / contraintes, etc. Une fois que vous avez retiré une vue / contrainte de la hiérarchie et que vous ne vous y avez pas fortement, il sera retiré de la mémoire.

Notez également que la combinaison de faible et ! est un peu dangereuse car ! dénote une référence que vous attendez de ne jamais être nil .

Ceci peut conduire à des erreurs, par exemple: xxx

personnellement, je fais toujours des points de vente fort . Pour tout faibles références, j'utilise toujours ? et pas ! .

Notez que faible Dans ce cas n'a rien à voir avec la protection contre les cycles de référence. C'était juste une décision personnelle des développeurs Xcode.

Historiquement, il pourrait y avoir une connexion avec uiviewcontroller.viewdidunload . Cependant, cette méthode n'est jamais appelée depuis iOS 6.


0 commentaires

0
votes

Apple recommande qu'un @iboutlet soit déclaré comme fort . De nombreuses discussions / articles peuvent être trouvés à ce sujet.

Si vous jetez un coup d'œil à cette vidéo d'Apple WWDC 2015 , à droite autour de la marque 32:30: https://developer.apple.com/videos/play/wwdc2015/407/

il déclare:

En général, vous devriez rendre votre sortie forte, surtout si vous connectez une sortie à une sous-vision ou à une contrainte qui ne sera pas toujours retenue par la hiérarchie de vue. La seule fois où vous avez vraiment besoin de faire un point faible, c'est si vous avez une vue personnalisée qui fait référence à quelque chose de sauvegarde de la hiérarchie de vue et en général qui n'est pas recommandée.


0 commentaires