Objective-C: propiedades de exponer en una clase

Me gustaría mostrar y discutir algunos ejemplos acerca de cómo agregar y manipular las propiedades de la clase Objective-C. : Un ejemplo clásico es, precisamente, lo siguiente, en la definición de nuestra clase de interfaz define dos propiedades nome y cognome :

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

NSObject { @ Interface MyClass: NSObject {
nome; NSString * nombre;
cognome; NSString * nombre;
}

retain ) NSString * nome; @ Propiedad (retener) NSString * nombre;
retain ) NSString * cognome; @ Propiedad (retener) NSString * nombre;
@ End

e setter usati rispettivamente per leggere ed impostare le nostre due proprietà: En el archivo de la aplicación de la instrucción INSERT @synthesize lo que Xcode se producen para nosotros los métodos getter y setter , respectivamente, que se utiliza para leer y establecer las dos propiedades:

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

@ Implementación MyClass

@ Name Sintetizar y apellidos;

@ End

, possiamo scrive: Cuando usted va a utilizar la clase MyClass , que es cuando istanziaremo un objeto de tipo MyClass , se puede escribir:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/ / Cualquier otra clase, como AppDelegate
/ / En el archivo. H
# Importar <UIKit/UIKit.h>
# Import "MyClass.h"

@ Clase TestViewController;

NSObject <UIApplicationDelegate> { @ Interface TesAppDelegate: NSObject {<UIApplicationDelegate>
UIWindow * ventana;
* TestViewController ViewController;

MyClass * miClase;
}

/ / En el archivo. M
MyClass alloc ] ; myClass = [MyClass alloc];
"Giovambattista" ; miaClasse.nome @ = "Giovambattista";
"miaClasse.nome = %@" , miaClasse.nome ) ; NSLog (@ "miaClasse.nome =% @", miaClasse.nome);

O, lo que es equivalente a:

1
2
3
/ / Siempre en la M archivo.
@ "Undolog" ] ; [SetNome myClass: @ "Undolog"];
"miaClasse.nome = %@" , [ miaClasse nome ] ) ; NSLog (@ "miaClasse.nome =% @", [nombre miClase]);

Hasta aquí todo bien. Sin embargo, podría inducir a error a la equivalencia de las "variables" internas (ivar) con el nombre de la propiedad en sí. Para entender la diferencia, proponer de nuevo lo mismo que hacerlo fuera, esta vez, la @synthesize . . Ahora, por lo tanto, debemos tener cuidado en escribir los métodos getter y setter . Para enfatizar aún más las diferencias, se cambie el nombre de las variables internas mediante la inserción de un guión bajo delante del nombre. Sin embargo, vemos el código:

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

NSObject { @ Interface MyClass: NSObject {
_nome; NSString * _name;
_cognome; NSString * _cognome;
}

NSString * ) nome; // get - ( NSString *) Nombre; / / obtener
NSString * ) cognome; // get - ( NSString *) Nombre; / / obtener

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

@ End

. A diferencia de los punteros antes de las variables internas (incapsultate) se han convertido en _nome y _cognome . . @property è scomparso, in quanto non serve più. Además hay cuatro definiciones de los métodos que representan nuestra get y set . @property ha desaparecido, ya que no necesita más.
Vemos el archivo de implementación 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"

@ Implementación MyClass

/ / Obtener un "nombre"
NSString * ) nome { - ( NSString *) Nombre {
_name Retorno;
}
/ / Set para "nombre"
void ) setNome : ( NSString * ) stringaIngresso { - (Void) setNome: ( NSString *) {stringaIngresso
_name StringaIngresso =;
}

/ / Obtener de "apellido"
NSString * ) cognome { - ( NSString *) Nombre {
_cognome retorno;
}
/ / Set para "apellido"
void ) setCognome : ( NSString * ) stringaIngresso { - (Void) setCognome: ( NSString *) {stringaIngresso
_cognome = stringaIngresso;
}

@ End

Escrito como una clase se puede utilizar exactamente igual que el anterior, a saber:

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

/ / O, lo que equivale a:

@ "Undolog" ] ; [SetNome myClass: @ "Undolog"];
"miaClasse.nome = %@" , [ miaClasse nome ] ) ; NSLog (@ "miaClasse.nome =% @", [nombre miClase]);

e set , evidenziando – anche con l'aggiunta dell'underscore – le differenze tra il nome della proprietà e la sua ivar interna _nome . En el nivel de abandono educativo @synthesize nos obligó a escribir "su propia" métodos de get y set , destacando - incluso con la adición dell'underscore - las diferencias entre el nombre de la propiedad y su ivar interna _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. En el nivel funcional del uso personal de los métodos de get y set permite un control real de los datos antes de su puesta (o antes de su lectura) y un encapsulado real para proteger a la variable interna.
Por ejemplo, sería posible para impedir el paso de cadenas vacías a la propiedad nome :

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

Otra variación

Si desea utilizar las variables internas con el guión bajo delante (que rpoviene Adobe ActionScript puede ser utilizado también) no es necesario abandonar el uso de la directiva @synthesize . Xcode permite "fusionar" los métodos mencionados anteriormente:

1
2
_nome; Sintetizar @ name = _name;
_cognome; @ Name = Sintetizar _cognome;

. Al hacerlo, puede usar el puntero para las personas internamente _nome ", resumió" - en el exterior - como una propiedad de 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 . Por otra parte, es cierto que el uso de @synthesize produce la generación de métodos automáticos (mensajes) de getter y setter , también es cierto que si no las encuentra, por lo que si quieren "aplicar" un método para su getter y / o setter que usted puede hacer esto incluso si ha utilizado la directiva @synthesize .

Las asignaciones de memoria

En los ejemplos anteriores he omitido algunos detalles importantes para una implementación real. En primer lugar, no han mostrado ningún método init() , útil para la inicialización de objetos y valores por defecto. Por otra parte, está la adición de un método 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
/ / Archivo MyClass.m
# Import "MyClass.h"

@ Implementación MyClass

id ) init { - (Id) {init
self = [ super init ] ) { if (self = [super init]) {
"Nome preimpostato" ; _name @ = "Nombre del ajuste";
"Cognome preimpostato" ; _cognome @ = "Nombre del ajuste";
}
cambio sí;
}

void ) dealloc { - (Void) {dealloc
; [_name Release];
; [_cognome Release];
; [Super dealloc];
}

NSString * ) nome { - ( NSString *) Nombre {
_name Retorno;
}
void ) setNome : ( NSString * ) stringaIngresso { - (Void) setNome: ( NSString *) {stringaIngresso
stringaIngresso == @ "" ) stringaIngresso = @ "senza nome" ; if (@ stringaIngresso == "") @ stringaIngresso = "sin nombre";
_name StringaIngresso =;
}

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

@ End

, etc… En el futuro veremos entonces los detalles de las propiedades readonly , retain , etc ... :)

No hay comentarios para esta entrada

Deja un comentario

XHTML PERMISO TAG: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> código de inserción:
 <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