Ce que vous voulez probablement (à moins que vous n'utilisiez un système d'exploitation et un compilateur très anciens), c'est utiliser la syntaxe des propriétés. C'est à dire :
@interface MyClass : NSObject
// method declarations here ...
@property (copy) NSString* myVar;
// ... or here.
@end
Cela fera ce que vous vouliez faire. Elle synthétise implicitement une variable d'instance et une paire getter/setter pour cette variable. Si vous avez voulu créer manuellement la variable d'instance (vous n'en avez généralement pas besoin à moins que votre code ne doive fonctionner sur de très vieilles versions de MacOS), voici ce que le code ci-dessus fait sous le capot pour créer l'ivar :
@interface MyClass : NSObject
{
NSString* _myVar;
}
// method declarations here.
@end
Notez les accolades, qui indiquent au compilateur qu'il ne s'agit pas simplement d'une variable globale située entre les méthodes, mais bien d'une variable d'instance appartenant à cet objet.
Si vous créez la propriété uniquement pour un usage interne et que vous ne voulez pas que les clients de votre classe la manipulent, vous pouvez la cacher un peu dans tous les compilateurs ObjC, sauf les plus anciens, en utilisant une propriété de type extension de classe qui "poursuit" la déclaration de classe de l'en-tête, mais qui peut être placée séparément (donc généralement dans votre fichier d'implémentation). Une extension de classe ressemble à une catégorie sans nom :
@interface MyClass ()
@property (copy) NSString* myVar;
@end
Et vous pouvez y mettre votre déclaration de propriété, ou même des déclarations ivar (toujours entre crochets). Vous pouvez même déclarer la même propriété que readonly
dans l'interface de la classe, puis la re-déclarer à l'identique, mais en tant que readwrite
dans l'extension, de sorte que les clients ne puissent que la lire, mais que votre code puisse la modifier.
Notez que si vous n'utilisez pas l'ARC (c'est-à-dire si vous avez désactivé le comptage automatique des références par défaut), vous devrez définir toutes vos propriétés comme suit nil
dans votre dealloc
(à moins qu'ils ne soient réglés sur weak
o assign
bien sûr).
NB - Tous les éléments ci-dessus sont @interface
sections. Votre code réel sera placé dans des sections distinctes @implementation
sections. Cela permet d'avoir des fichiers d'en-tête ( .h
) que vous pouvez remettre aux clients de votre classe et qui ne contiennent que les parties que vous voulez qu'ils utilisent, et qui cachent les détails de l'implémentation dans le fichier d'implémentation ( .m
) où vous pouvez les modifier sans avoir à craindre que quelqu'un les ait accidentellement utilisés et que vous cassiez d'autres codes.
PS - Notez que NSStrings
et d'autres objets que vous voulez immuables, mais qui existent aussi en version mutable (c.-à-d. NSMutableString
) devrait toujours être copy
car cela transformera une NSMutableString en NSString, de sorte que personne à l'extérieur ne pourra modifier la chaîne mutable qui se trouve en dessous de vous. Pour tous les autres types d'objets, vous utilisez généralement strong
(ou retain
s'il ne s'agit pas d'un ARC). Pour le propriétaire de votre classe (par exemple son délégué), vous utilisez généralement weak
(ou assign
s'il ne s'agit pas d'un ARC).
1 votes
Objective-C est plus proche de C/C++ que de Java. Java est relativement unique en ce sens qu'il n'a pas de fichiers de déclaration et d'implémentation séparés, mais qu'il met tout dans un seul fichier. En Objective-C, vous déclarez les champs d'instance dans la section @interface de votre fichier .h.