Objective-C: les propriétés d'exposer dans une classe

Je voudrais montrer et de discuter quelques exemples sur la façon d'ajouter et de manipuler les propriétés en Objective-C de classe. : Un exemple classique, précisément, est la suivante, dans la définition de notre classe d'interface définit deux propriétés nome et cognome :

1
2
3
4
5
6
7
8
9
10
11
/ / MyClass.h
# Import <Foundation/Foundation.h>

NSObject { @ Interface MaClasse: NSObject {
nome; NSString * name;
cognome; NSString * name;
}

retain ) NSString * nome; @ Property (conserver) NSString * name;
retain ) NSString * cognome; @ Property (conserver) NSString * name;
@ Fin

e setter usati rispettivamente per leggere ed impostare le nostre due proprietà: Dans le fichier de mise en œuvre de l'instruction INSERT @synthesize afin que Xcode va produire pour nous les méthodes getter et setter , respectivement, utilisé pour lire et définir nos deux propriétés:

1
2
3
4
5
6
7
8
/ / MyClass.m
# Import "MyClass.h"

@ Mise en oeuvre MaClasse

Synthétiser le nom @, prénom;

@ Fin

, possiamo scrive: Lorsque vous allez utiliser notre classe MyClass , qui est quand istanziaremo un objet de type MyClass , nous pouvons écrire:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/ / Tout autre classe, comme AppDelegate
/ / Dans le fichier. H
# Import <UIKit/UIKit.h>
# Import "MyClass.h"

@ Classe TestViewController;

NSObject <UIApplicationDelegate> { TesAppDelegate @ interface: NSObject {<UIApplicationDelegate>
UIWindow * fenêtre;
* TestViewController ViewController;

MaClasse * maClasse;
}

/ / Dans le fichier. M
MyClass alloc ] ; maClasse = [MaClasse alloc];
"Giovambattista" ; miaClasse.nome @ = "Giovambattista";
"miaClasse.nome = %@" , miaClasse.nome ) ; NSLog (@ "miaClasse.nome =% @", miaClasse.nome);

Ou, ce qui équivaut à:

1
2
3
/ / Toujours dans le fichier de M.
@ "Undolog" ] ; [SetNome maClasse: @ "Undolog"];
"miaClasse.nome = %@" , [ miaClasse nome ] ) ; NSLog (@ "miaClasse.nome =% @", [nom maClasse]);

Jusqu'ici tout va bien. Cependant, il pourrait induire en erreur l'équivalence de la «variable» interne (Ivar) avec le nom de la propriété elle-même. Pour comprendre la différence, de proposer à nouveau la même chose que faire sans, cette fois, les @synthesize . . Maintenant, donc, nous devrions prendre soin d'écrire les méthodes getter et setter . Afin de mieux souligner les différences, va renommer les variables internes en insérant un caractère de soulignement devant le nom. Mais nous voyons le code:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Import <Foundation/Foundation.h>

NSObject { @ Interface MaClasse: NSObject {
_nome; NSString * _Nom;
_cognome; NSString * _cognome;
}

NSString * ) nome; // get - ( NSString *) nom; / / récupère
NSString * ) cognome; // get - ( NSString *) nom; / / récupère

void ) setNome : ( NSString * ) stringaIngresso; // set - (Void) setNome: ( NSString *) stringaIngresso; / / set
void ) setCognome : ( NSString * ) stringaIngresso; // set - (Void) setCognome: ( NSString *) stringaIngresso; / / set

@ Fin

. Contrairement à la précédente pour les pointeurs de variables internes (incapsultate) sont devenus _nome et _cognome . . @property è scomparso, in quanto non serve più. En outre, il existe quatre définitions des méthodes qui représentent notre get et de set . @property a disparu, comme n'étant plus nécessaires.
Nous voyons le fichier d'implémentation MyClass.m :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# Import "MyClass.h"

@ Mise en oeuvre MaClasse

/ / Obtenir un "nom"
NSString * ) nome { - ( NSString *) nom {
_Nom Retour;
}
/ / Set pour "nom"
void ) setNome : ( NSString * ) stringaIngresso { - (Void) setNome: ( NSString *) {stringaIngresso
_Nom StringaIngresso =;
}

/ / Obtenir de "surnom"
NSString * ) cognome { - ( NSString *) nom {
_cognome retour;
}
/ / Set pour "patronyme"
void ) setCognome : ( NSString * ) stringaIngresso { - (Void) setCognome: ( NSString *) {stringaIngresso
_cognome = stringaIngresso;
}

@ Fin

Écrit comme une classe peut être utilisé exactement comme la précédente, à savoir:

1
2
3
4
5
6
7
8
MyClass alloc ] ; maClasse = [MaClasse alloc];
"Giovambattista" ; miaClasse.nome @ = "Giovambattista";
"miaClasse.nome = %@" , miaClasse.nome ) ; NSLog (@ "miaClasse.nome =% @", miaClasse.nome);

/ / Ou, ce qui équivaut à:

@ "Undolog" ] ; [SetNome maClasse: @ "Undolog"];
"miaClasse.nome = %@" , [ miaClasse nome ] ) ; NSLog (@ "miaClasse.nome =% @", [nom maClasse]);

e set , evidenziando – anche con l'aggiunta dell'underscore – le differenze tra il nome della proprietà e la sua ivar interna _nome . Au niveau de la négligence éducative @synthesize nous a forcé à écrire "leur propre" méthodes get et de set , en soulignant - même avec l'ajout dell'underscore - les différences entre le nom de propriété et ses Ivar internes _nome .
permette un reale controllo del dato prima della sua impostazione (o prima della sua lettura) e quindi un reale incapsulamento per proteggere la variabile interna. Au niveau fonctionnel à l'usage personnel des méthodes get et de set permet un contrôle réel des données avant sa mise (ou avant sa lecture), puis une encapsulation réel de protéger la variable interne.
Par exemple, il serait possible d'empêcher le passage des chaînes de vide à la propriété nome :

1
2
3
4
void ) setNome : ( NSString * ) stringaIngresso { - (Void) setNome: ( NSString *) {stringaIngresso
stringaIngresso == @ "" ) stringaIngresso = @ "senza nome" ; if (@ stringaIngresso == "") @ stringaIngresso = "sans nom";
_Nom StringaIngresso =;
}

D'autres variations

Si vous souhaitez utiliser les variables internes avec le trait de soulignement en face (qui rpoviene Adobe ActionScript pourrait être utilisé aussi bien) n'est pas nécessaire d'abandonner l'utilisation de la directive @synthesize . Xcode permet de "fusionner" les méthodes mentionnées ci-dessus:

1
2
_nome; Synthétiser @ name = _Nom;
_cognome; Synthétiser le nom @ = _cognome;

. En faisant cela, nous pourrions utiliser le pointeur à l'interne _nome ", résume" - à l'extérieur - comme une propriété nome . e setter , è vero anche che lo fa solo se non li trova, quindi se desiderate “implementare” un vostro metodo di getter e/o setter potete farlo anche se avete usato la direttiva @synthesize . Par ailleurs, il est vrai que l'utilisation de @synthesize produit des méthodes de génération automatique (messages) de getter et setter , il est également vrai que s'il ne les trouve pas, donc si vous voulez "mettre en œuvre« une méthode pour vos getter et / ou setter vous pouvez le faire même si vous avez utilisé la directive @synthesize .

Les allocations de mémoire

Dans les exemples ci-dessus, j'ai omis certains détails importants pour une mise en œuvre réelle. Tout d'abord, je n'ai pas montré toute méthode init() , utile pour l'initialisation objet et les valeurs par défaut. Par ailleurs, il est l'ajout d'une méthode dealloc() :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
/ / Fichier MyClass.m
# Import "MyClass.h"

@ Mise en oeuvre MaClasse

id ) init { - (Id) {initialisation
self = [ super init ] ) { if (self = [super init]) {
"Nome preimpostato" ; _Nom @ = "Nom Preset";
"Cognome preimpostato" ; _cognome @ = "Nom Preset";
}
le retour de soi;
}

void ) dealloc { - (Void) dealloc {
; [Communiqué de _Nom];
; [Communiqué de _cognome];
; [Super dealloc];
}

NSString * ) nome { - ( NSString *) nom {
_Nom Retour;
}
void ) setNome : ( NSString * ) stringaIngresso { - (Void) setNome: ( NSString *) {stringaIngresso
stringaIngresso == @ "" ) stringaIngresso = @ "senza nome" ; if (@ stringaIngresso == "") @ stringaIngresso = "sans nom";
_Nom StringaIngresso =;
}

NSString * ) cognome { - ( NSString *) nom {
_cognome retour;
}
void ) setCognome : ( NSString * ) stringaIngresso { - (Void) setCognome: ( NSString *) {stringaIngresso
_cognome = stringaIngresso;
}

@ Fin

, etc… Dans l'avenir, nous verrons ensuite les détails sur les propriétés readonly , retain , etc ... :)

Il n'y a aucun commentaire pour cet article

Laisser un commentaire

XHTML TAG PERMIS: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> CODE D'INSERTION:
 <pre></pre> // blocco generico <code></code> // blocco generico [cc_actionscript][/cc_actionscript] // Actionscript [cc_actionscript3][/cc_actionscript3] // Actionscript 3 [cc_css][/cc_css] // CSS Style Sheet [cc_html][/cc_html] // HTML [cc_js][/cc_js] // Javascript [cc_objc][/cc_objc] // Objective-C [cc_php][/cc_objc] // PHP [cc_sql][/cc_sql] // SQL