supposons que j'ai cette pièce de code: Lorsque vous utilisez ce champ / une propriété, il y a une différence entre les lignes: p> ? p> Lorsque vous effectuez une affectation, la méthode de la propriété effectuera des retenues correctes, mais qu'en est-il de l'accès en lecture à la propriété, comme décrit ci-dessus ? Y a-t-il une différence? P> p>
4 Réponses :
Un accessor non atomique synthétisé (ou correctement écrit à la main) équivalait fonctionnellement à de sorte qu'il n'y a pas de différence fonctionnelle entre vos deux exemples. P> Cependant, En dehors de -DeMoc ou vos initialiseurs, accédez régulièrement à la propriété via son accesseur est une bonne idée. P> P>
Utilisation de l'accesseur Self.bar est traduit en un appel de méthode: [Self Bar]. La syntaxe de la période est juste pour regarder. L'accès à la variable de membre n'implique directement pas d'appel de fonction supplémentaire et est donc légèrement plus rapide. Cela ne compte vraiment que si vous y accédez dans une boucle, ou dans un processus où cette différence s'ajoutera. (Sur l'iPhone) Les Setteurs créés pour les propriétés ont également une surcharge supplémentaire pour effectuer un codage de la valeur clé. Une notification KVO est envoyée lorsque vous appelez "Setbar:" ou dites "Self.bar =", appelez-la donc sur une inondation de notifications. P>
JIM a raison, cependant - il n'y a pas de différence fonctionnelle entre une nonatomique @property et une utilisation directe de la variable dans votre code. Sauf si vous êtes vraiment préoccupé par la vitesse, l'utilisation de la propriété est probablement votre meilleure mise. P>
Non, envisagez une classe dérivée qui remplace la barre (bar *);
Bon point Nikolai - depuis une barre de barreaux répandue - (bar *) peut ajouter une logique d'entreprise supplémentaire ou renvoyer quelque chose d'autre que la barre, l'utilisation de la propriété peut ne pas être équivalente à une référence directe à la variable. Merci d'avoir fait remarquer cela!
Juste pour être clair: la surcharge dont vous parlez ne dépend pas du consecteur créé via une déclaration @synthesize. Même si vous les implémentez, les notifications soi-même seront envoyées si un observateur est enregistré. Ceci est accompli à travers Isa Swizzling.
Il y a une grande différence.
L'ancien utilise la méthode d'accesseur, ce dernier accède directement à la barre de variable d'instance directement. P> Si vous utilisez le [auto.bar dostuff] code> est équivalent à [[auto bar] dostuff] code> [bar dostuff] code> est équivalent à [Self-> Bar Dostuff] Code> P> @ Synthétisez Code> Directive sur votre propriété CODE> BAR CODE>, le compilateur générera deux méthodes pour vous: P> - (void)setBar:(Bar*)b;
- (Bar*)bar;
Cependant, malgré la différence entre les mécanismes de sélecteur de getter et de champ, il n'ya toujours aucune différence fonctionnelle entre les lignes mentionnées. C'est à dire. Le même objet recevra le même message, non?
Eh bien, il peut y avoir. Puisque vous êtes libre de mettre en œuvre la barre de méthode de toute façon que vous voulez. Par exemple, vous pouvez retourner un objet proxy ou quel temps. Même si vous synthétiez les méthodes accessoires, elles peuvent se comporter différemment, comme la synchronisation de l'accès si vous définissez la propriété pour être atomique.
Mais dans le cas où je synthétise la propriété, même s'il y aurait une synchronisation ou un retenue, ou quoi que ce soit d'autre, il n'ya toujours aucune différence fonctionnelle entre les lignes mentionnées, dans le sens où même objet i> reçoit Même message I>, non?
Il y a définitivement une différence. Une classe dérivée pourrait remplacer la barre (bar *) et renvoyer un autre objet.
Si vous attribuez de la valeur à votre champ avec un constructeur pratique d'une classe de barres, votre champ de barre deviendra un zombie plus tôt que votre propriété de barre avec une option de conserver, car le nombre de références n'est pas incrémenté en attribuant à des champs, et parfois vous courez Erreur "Accès aux objets DealLocated". p>