10
votes

iOS: utilisation de soi et de soulignement (_) avec une variable

Duplicaté possible: strong>

Comment un soulignez-vous devant une variable dans un travail de classe Cocoa Objective-C? P>

J'ai été très confus avec l'utilisation de soi-même ou de la sous-traitance avec un nom de variable après la synthétisation comme ci-dessous: P> xxx pré>

basé sur mes compréhensions lorsque j'utilise auto.utilisateur code>, OS veillera à libérer la mémoire allouée précédemment dans la méthode définie afin de ne pas avoir besoin de prendre soin explicitement. p>

_USERS code> est une variable d'instance pour les utilisateurs et devrait être normalement utilisé tout en accédant à la variable des utilisateurs. Si j'utilise _USERS code> pour modifier sa valeur, il ne tirera pas de délégué kvo qui n'en informera pas une classe d'observation de la valeur des utilisateurs change. P>

d'ailleurs, auto -.utilisateur permet de différencier la variable manneule dans le nom de la méthode comme ci-dessous, P>

- (void)assignUsers:(NSMutableArray*)users {
      self.users = users;
}


1 commentaires

Salut @QEGAL Je suis passé à travers ce fil et si vous lisez ma question, la plupart des points sont les points de conclusion, mais ce que je ne pouvais pas obtenir, c'est quand utiliser quoi!


3 Réponses :


31
votes

Lorsque vous utilisez le auto.utilisateur code>, vous accédez à la propriété via le Setter ou Getter.

Lorsque vous utilisez le _USERS code>, vous accédez à la propriété. Ignorer directement le Setter ou Getter. P>


Voici une bonne démonstration de celui-ci: p>

- (void)setUsers:(id)users {
    _users = users; // GOOD : set your property correctly
}


2 commentaires

Cher Down-Voteurs ! J'aurais été honoré d'avoir des commentaires sur la raison pour laquelle vos mains tremblaient au-dessus du bouton d'électeur du bas, car - vous croyez ou non - je ne suis pas un lecteur d'esprit de le comprendre. Merci!


Je ne suis pas sûr du tout comment vous pensez que: "Vous montrez un abus de auto et ..." , pourriez-vous élaborer s'il vous plaît? la bonne démonstration montre la différence entre contournement et appeler le simulateur même à l'intérieur du setter, qui causerait une boucle récursive infinie et il se bloque lorsque La pile est débordée - par conséquent, l'approche finale évite de provoquer des boucles infinies en runtime.



8
votes

Je pense qu'il est utile de déterminer comment les propriétés sont (ou pourraient-elles être) mises en œuvre par le compilateur.

Lorsque vous écrivez auto.utilisateur = tableau; Le compilateur traduit ceci sur [ auto-setusers: tableau]; Lorsque vous écrivez array = self.uSers; Le compilateur traduit ceci sur array = [auto-utilisateurs];

@synthesize Ajoute un ivar à votre objet ( sauf si vous ne l'ajoutez pas vous-même ), et implémente les -utilisateurs et -Setutuers: Méthodes d'accessor pour vous ( sauf si vous fournissez votre propre )

si vous utilisez arc , -Settuseurs: ressemblera à quelque chose comme: < / p> xxx

si vous utilisez MRC (c'est-à-dire arc n'est pas activé), -SetUtilisateurs: va ressembler à quelque chose comme *: xxx

* - Notez qu'il s'agit d'une implémentation simplifiée et non atomique de -Setusers:


1 commentaires

La seule réponse sur ce sujet qui parle de la différence d'une perspective de comptage de référence avec une telle élégance. Excellent.



2
votes

Oui, c'est très correct. Quelques points mineurs:

iOS ne libère pas automatiquement d'objet simplement parce que vous utilisez la notation de points. Il libère un objet lorsque la propriété est déclarée copie ou conserver (ou fort in arc). Si, par exemple, vous utilisez un code non-ARC et que la propriété est déclarée comme Attribuer , il ne relâchera pas l'objet.

Avec la dernière version de la boîte à outils du développeur (Xcode 4.4+), vous ne devez plus synthétiser manuellement les propriétés - elles sont automatiquement synthétisées (avec le soulignement principal).


2 commentaires

Merci Jim. J'ai essayé Xcode 4.4 avec iOS 6 et oui, il ne nécessite pas de propriétés de synthèse, mais cette application fonctionnerait-elle sur la version inférieure d'IOS?


Oui - de la documentation officielle: La fonction par défaut @Synthesize ne nécessite aucun support spécial SDK ou Runtime. Questions comme ça, vous devriez lire la documentation.