Table des matières:
- Ce qui comprend une propriété déclarée
- Avec la syntaxe à point
- Écrire vos propres accesseurs
- Accès aux variables d'instance avec accesseurs
Vidéo: Learning iOS: Create your own app with Objective-C! by Tianyu Liu 2025
Bien que les propriétés et l'accès aux variables d'instance et les accesseurs soient souvent mélangés dans l'esprit de l'application iOS les programmeurs, assurez-vous que vous comprenez la nature unique des propriétés et comment elles fonctionnent vraiment.
Alors que méthodes concernent l'envoi de messages à des objets pour faire avancer les choses, propriétés concernent l'état des objets. Les cadres et autres objets se comportent en fonction de ce qu'ils trouvent dans leurs propriétés (vous pouvez donc modifier le comportement de l'objet en changeant une propriété).
Vous pouvez également vouloir en savoir plus sur l'état de l'objet, comme sa couleur, ou sur le contrôleur Root View d'une fenêtre.
Les contrôleurs de vue de votre application, qui servent de pont entre les vues et le modèle, doivent être en mesure de trouver l'objet modèle pour obtenir des données et leur envoyer des mises à jour. Tout cela est fait en utilisant des propriétés. Une propriété ressemble à ceci:
@property (strong, nonatomic) IBOutlet UIImageView * car;
Mais toutes les propriétés ne sont pas des points de vente. Si vous sélectionnez RTAppDelegate. h fichier dans l'inspecteur de projet, vous pouvez voir qu'il comprend une propriété:
@property (fort, nonatomic) Fenêtre UIWindow *;
Comme vous pouvez le voir, l'ordre des attributs (fort, non atomique contre nonatomique, fort) n'a pas d'importance.
Ce qui comprend une propriété déclarée
Une propriété déclarée a deux parties: sa déclaration et son implémentation.
La déclaration utilise le mot clé @property, suivi d'un ensemble d'attributs entre parenthèses facultatif, des informations de type et du nom de la propriété.
L'accès aux propriétés est implémenté par des méthodes accesseurs (bien que dans la classe qui déclare la propriété, la propriété soit directement accessible, comme le sont les variables d'instance). Vous pouvez écrire vos propres méthodes d'accès ou vous pouvez laisser le compilateur le faire pour vous.
Les noms par défaut pour les méthodes getter et setter associées à une propriété sont quel que soit ThePropertyNameIs pour le getter et setWhateverThePropertyNameIs: pour le setter. Dans le cas d'un déclenchement, la méthode getter est trip, et la méthode setter est setTrip:.
Pour accéder à la propriété de trajet dans appDelegate, vous devez utiliser
AppDelegate * appDelegate = [[UIApplication sharedApplication] delegate]; Trip * thisTrip = [appDelegate voyage];
ou pour définir cette propriété, utilisez
AppDelegate * appDelegate = [[UIApplication sharedApplication] delegate]; [appDelegate setTrip: newTrip];
délégué, en passant est une propriété UIApplication.
Avec la syntaxe à point
Objective-C fournit un opérateur point (.) Qui offre une alternative à la notation en crochet ([]) pour appeler les méthodes d'accès. Vous utilisez la syntaxe par points comme vous le feriez pour un élément de structure C:
Trip * thisTrip = appDelegate. voyage;
ou pour définir cette propriété, utilisez
appDelegate. trip = newTrip;
Cependant, lorsqu'elle est utilisée avec des objets, la syntaxe par points agit comme du «sucre syntaxique» - elle est transformée par le compilateur en un message accesseur. La syntaxe Dot n'obtient pas directement ou ne définit pas une variable d'instance. Les exemples de code qui l'utilisent sont l'équivalent exact de l'utilisation de la notation de parenthèse.
De nombreux programmeurs aiment la syntaxe à points car elle peut être plus lisible. il suffit de penser à ces situations de notation de parenthèse où vous accédez à une propriété qui est une propriété d'un autre objet (elle-même est une propriété d'un autre objet, et ainsi de suite).
Le vrai avantage de la syntaxe par points, cependant, est que le compilateur va générer une erreur lorsqu'il détecte une tentative d'écriture dans une propriété déclarée en lecture seule. C'est tellement mieux que d'avoir à se contenter d'une méthode non déclarée d'avertissement parce que vous avez invoqué une méthode de setter inexistante, avec l'application échouant par la suite à l'exécution.
Lorsque vous utilisez le compilateur pour créer des méthodes d'accès pour vous, le compilateur crée une variable d'instance du type que vous avez déclaré qu'il utilisera ensuite pour stocker et récupérer la valeur de propriété avec le nom de la propriété. Par exemple pour la propriété suivante:
@property (weak, nonatomic) IBOutlet UIImageView * car;
l'instruction
@synthesize car;
génère une variable d'instance avec le nom de voiture du type UIImage.
Cependant, si vous laissez le compilateur générer automatiquement une instruction @synthesize pour vous, il utilise en fait un nom de variable d'instance commençant par un caractère de soulignement, ainsi vous obtiendrez le code suivant généré en coulisses:
@ synthétiser voiture = _car;
Cela vous permet de faire la distinction entre le nom de la propriété (accédé par self.car) et le nom de la variable d'instance (accessible simplement par _car).
Apple vous recommande d'utiliser la référence de propriété (self.car) dans les méthodes normales, mais d'utiliser la variable _car dans les méthodes init. Cela s'applique uniquement au code dans un fichier. Le code ailleurs dans votre application accède à la propriété telle qu'elle est déclarée dans la section @interface du fichier. h.
Il n'y a aucun moyen que le code n'importe où dans l'application, sauf dans le. m fichier d'une classe peut accéder à la variable d'instance directement lorsque vous laissez le compilateur faire le travail. Et c'est une bonne chose de s'assurer que l'encapsulation est correctement fournie.
Écrire vos propres accesseurs
Vous n'avez pas besoin d'utiliser les accesseurs générés par le compilateur; et, parfois, il est même logique de les implémenter soi-même. Si vous implémentez vous-même les méthodes d'accesseur, vous devez vous assurer que votre approche correspond aux attributs que vous avez déclarés.
Par exemple, si vous avez beaucoup d'overhead pour créer un objet qui pourrait ne pas être utilisé, vous pouvez créer votre propre accesseur getter qui crée l'objet la première fois qu'il est accédé.De plus, écrire votre propre accesseur signifie que vous n'avez pas besoin d'avoir une variable d'instance associée à la propriété.
Vous pourriez, par exemple, avoir une propriété area sur un objet représentant un rectangle. Le getter pour la zone peut effectuer une longueur x largeur et ne jamais déranger avec une variable d'instance.
Accès aux variables d'instance avec accesseurs
Si vous n'utilisez pas self, vous accédez directement à la variable d'instance. Dans l'exemple suivant, la méthode set accessor pour _currentDestinationIndex n'est pas appelée:
_currentDestinationIndex = [[NSUserDefaults standardUserDefaults] objectForKey: CurrentDestinationKey];
Ce qui précède n'est pas la même chose que
soi. currentDestinationIndex = [[NSUserDefaults standardUserDefaults] objectForKey: CurrentDestinationKey];
Pour utiliser un accesseur, vous devez utiliser self.
