Raison d'utiliser ivars vs propriétés dans l'objectif c
J'ai été incapable de trouver toutes les informations sur ce sujet et la plupart de ce que j'en sais il est arrivé complètement par accident (et de quelques heures à essayer de comprendre pourquoi mon code ne fonctionnait pas). Alors que l'apprentissage d'objective-c la plupart des tutos que j'ai trouvé en faire des variables et des propriétés du même nom. Je ne comprends pas la signification, car il semble que la propriété fait tout le travail et la variable type de siège. Par exemple:
Test.h
@interface Test : NSObject {
int _timesPlayed, _highscore;
}
@property int timesPlayed, highscore;
//Methods and stuff
@end
Test.m
@implementation Test
@synthesize timesPlayed = _timesPlayed;
@synthesize highscore = _highscore;
//methods and stuff
@end
Ce que je sais
1) Bon alors aujourd'hui j'ai découvert (après des heures de confusion) que n'importe comment beaucoup de changement-vous faire pour les propriétés highscore = 5091231
cela ne va pas changer quoi que ce soit quand vous essayez d'appeler [test score] comme il sera toujours retourner la valeur de _highscore qui (je pense) est le ivar qui a été mis en test.h. Donc tout changement de variables dans l'essai.m doit être en train de changer _highscore et pas les meilleurs scores. (Corrigez-moi si je me trompe s'il vous plaît)
2) Si je comprends bien (je n'ai probablement pas) le ivars ensemble dans l'essai.h représentent la mémoire réelle où, comme le @propriétés sont juste des moyens d'accéder à cette mémoire. Donc en dehors de la mise en œuvre, je ne peux pas accéder à _highscore sans passer par la propriété.
Ce que je ne comprends pas
Fondamentalement, ce que je ne comprends pas au sujet de cette situation est de savoir si ou non je besoin pour utiliser le ivars, ou si je peux utiliser @bien et @synthétiser. Il semble que le ivars sont juste extra code qui ne sont pas vraiment faire quelque chose, mais me confondre. Certains des plus récents tutoriaux que j'ai vu ne semblent pas utiliser ivars mais certains le font. Alors est-ce juste un codage de préférence chose ou est-il réellement important? J'ai essayé de chercher par le biais de la Documentation d'Apple mais j'ai plutôt perdu là-bas et ne semblent jamais trouver ce que je cherche. Toute orientation sera grandement apprécié.
source d'informationauteur CaldwellYSR
Vous devez vous connecter pour publier un commentaire.
Vous pouvez penser de la syntaxe pour la synthèse des propriétés
@synthesize propertyName = variableName
.Cela signifie que si vous écrivez
@synthesize highscore = _highscore;
une nouvelle ivar avec le nom_highscore
sera créé pour vous. Donc si vous voulez vous pouvez accéder à la variable dont la propriété est enregistrée directement en allant à la_highscore
variable.Un peu de fond de
Avant une certaine version du compilateur que je ne me souviens pas de la synthèse de l'instruction n'a pas créé le ivar. Au lieu de cela il a seulement dit quelle variable il doit utiliser de sorte que vous doit le déclarer à la fois la variable et de la propriété. Si vous synthétisés avec un trait de soulignement préfixe alors votre variable nécessaires à ont le même préfixe. Maintenant, vous n'avez pas à créer la variable plus soi-même, au lieu d'une variable avec la
variableName
que vous avez spécifié dans la synthèse de la déclaration sera créé (si vous ne l'avez pas déjà déclarer vous-même dans ce cas, il est juste utilisé comme support de la variable de la propriété).Ce que votre code est en train de faire
Vous sont explicitement la création d'un ivar appelé
highscore
lors de la déclaration de la variable, puis implicitement la création d'un autre ivar appelé_highscore
lors de la synthèse de la propriété. Ce ne sont pas de la même variable, donc le changement de l'un d'entre eux, ne change rien à l'autre.Devriez-vous utiliser des variables ou pas?
C'est vraiment une question à propos de préférence.
Pro variables
Certaines personnes pensent que le code devient plus propre si vous n'avez pas à écrire
self.
tous sur la place. Les gens disent aussi que c'est plus rapide car il n'a pas besoin d'un appel de méthode (bien qu'il soit probablement jamais, jamais, jamais va avoir un effet mesurable sur les performances de vos applications).Propriétés Pro
La modification de la valeur de la propriété appelons tout le nécessaire KVO méthodes ainsi que d'autres classes peuvent être averti lorsque la valeur change. Par défaut, l'accès à des propriétés est également atomique (ne peut être consulté à partir de plus d'un thread) de sorte que la propriété est plus sûr à lire et à écrire à partir de plusieurs threads (cela ne veut pas dire que l'objet que le bien est thread-safe, si c'est une mutable tableau puis plusieurs thread peut encore casser des choses vraiment mauvais, il ne fera qu'empêcher les deux fils de la définition de la propriété à des choses différentes).
Vous pouvez simplement utiliser
@property
et@synthesize
sans déclarer les ivars, comme vous l'avez suggéré. Le problème ci-dessus, c'est que votre@synthesize
mappé le nom de la propriété à un nouveau ivar qui est généré par le compilateur. Donc, à toutes fins et intentions, votre définition de la classe est maintenant:L'attribution d'une valeur directement à la ivar
timesPlayed
ne s'affichera jamais si vous y accédez viaself.timesPlayed
puisque vous n'avez pas de modifier la bonne ivar.Vous avez plusieurs choix:
1 Retirez les deux ivars vous avez déclaré dans votre post original et laissez les
@property
/@synthesize
dynamique duo faire leur chose.2 Changer vos deux ivars être préfixés par un underscore '_'
3 Changer votre
@synthesize
états:En général, je viens de l'utiliser @bien et @synthenize.
@property donne le compilateur et l'utilisateur des instructions sur la façon d'utiliser votre propriété. le temps qu'il a un setter, ce qui setter est. Ce type de valeur, il attend et retours. Ces instructions sont ensuite utilisés par la saisie semi-automatique (et, finalement, le code qui permettra de compiler à l'encontre de la classe) et par le @synthétiser
@synthétiser, par défaut, créez une instance de la variable avec le même nom que votre propriété (ce qui peut prêter à confusion)
En général, je ne les suivants
ce sera par défaut créer un getter et un setter et de gérer l'autorelease ainsi que de créer la variable d'instance. La variable d'instance, il utilise est _propertyItem. si vous souhaitez accéder à la variable d'instance, vous pouvez l'utiliser comme tel.
c'est une erreur tho. Vous devriez toujours utiliser les getter et setter. cela permettra le lancement de l'application et de renouveler en tant que de besoin.
C'est la meilleure façon de le gérer. Et la raison de l'utilisation de l' = _propertyItem section de synthétiser est si vous ne pouvez pas effectuer les opérations suivantes.
il vous conseillons de le remplacer avec _propertyItem. mais vous devez utiliser l'auto.propertyItem à la place.
J'espère que cette information aide.
Dans votre exemple,
@synthesize timesPlayed = _timesPlayed;
crée un nouveau ivar appelé_timesPlayed
et la propriété se réfère à celle-ivar.timesPlayed
sera entièrement variable séparée avec aucun rapport avec la propriété. Si vous venez d'utiliser@synthesize timesPlayed;
alors la propriété de se référer àtimesPlayed
.Le but de le trait de soulignement de la convention est de rendre plus facile pour éviter accidentellement assigner directement à un ivar quand vous voulez être le faire par le biais de la propriété (c'est à dire par le biais de la synthèse méthode de définition). Cependant, vous pouvez toujours acces _timesPlayed directement si vous le voulez vraiment. Faire la synthèse d'une propriété tout simplement auto-génère un getter et setter pour le ivar.
En général, vous n'avez pas besoin de déclarer un ivar pour un bien, même s'il peut y avoir des cas où vous voudrez.
Cela peut être une vieille question.. mais dans "les temps modernes",
@synthesize
- n'est PAS nécessaire.La
_underscored
la sauvegarde de ivar EST synthétisé automatiquement... et est disponible au sein de CETTE classe de mise en œuvre, directement (à savoir. sans remettreself
/l'appel de l'généré automatiquement accesseurs).Vous ne besoin à en faire la synthèse, si vous voulez soutenir la sous-classe " de la capacité à accéder à la
_backingIvar
(sans appelerself
), ou pour une multitude d'autres raisons, il est décrit ailleurs.