Una de las ventajas de los archivos de la lista Propiedad, que son simplemente archivos de texto que siguen el estándar XML, es que al instante se puede transformar en objetos (como matriz o diccionario) de Objective-C. Cuando se crea una lista de archivos de propiedad:

Continuación ...
Si usted va a desarrollar en un ambiente donde es imposible utilizar las herramientas de depuración, como Firebug , como el simulador de iPhone de Apple en Xcode, que puede llegar a ser frustrante para encontrar problemas, incluyendo el acceso incorrecto a todas las propiedades de un objeto. Aquí es que la utilización de obras alert() es fundamental!
Continuación ...
En Objective-C tenemos dos muy acostumbrados a recibir y enviar mensajes entre las clases: las notificaciones y los delegados. La diferencia entre los dos, además de ser a nivel de aplicación, depende sustancialmente de "cómo" - objetos - puede recibir un mensaje. En primer lugar permítanme mostrar cómo el concepto nació de delegado.
Continuación ...
Incluso en el tutorial más simples que usted puede encontrar el uso de protocolos. Sin duda, va a pasar a muchos en su controlador para utilizar un protocolo, escribir, junto a la definición de la interfaz, una declaración similar a:
1 2 3
| UIViewController <uiwebviewdelegate> { @ Interface myViewController: {UIViewController <uiwebviewdelegate> ... } |
Continuación ...
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 :
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 ... 
Continuación ...
En el post de extender MovieClip en Flash MX tenía una idea de extender un clip de película. En particular, me dijo que el uso de MovieClip.prototype no permite la extensión de sus métodos, pero sólo:
[...] Dos importantes limitaciones de esta técnica son:
- No se puede aplicar a todos los objetos expuestos en Flash
- Pueden ser ", agregó" sólo los métodos y propiedades no [...]
De hecho, es posible, con un paso adicional, incluso cuando se utiliza de forma dinámica las propiedades añadir MovieClip.prototype . , infatti, Flash permetteva l'aggiunta di proprietà (in lettura/scrittura o solo lettura) tramite il metodo addProperty() . Antes de la introducción de la function get y function set , de hecho, permite la adición de las propiedades de Flash (lectura / escritura o sólo lectura) a través de la addProperty() . En la práctica esto se traduce en la invocación del método addProperty() y la definición de dos captadores y definidores. El armador puede ser null con el fin de crear propiedad de sólo lectura. Por ejemplo si quisiéramos extender MovieClip con todas las propiedades nuevas _alpha puede agregar animación, acaba de escribir el siguiente código:
1 2 3 4 5 6 7
| : Number { función _get_alpha (): Número { this . _alpha ) ; retorno (this. _alpha); } v : Number ) : Void { _set_alpha función (v: Número ): Void { this , "_alpha" , Strong . easeOut , this . _alpha , v , 1 , true ) ; nueva Tween (this, "_alpha", easeOut fuerte, este _alpha, v, 1, es verdad..); } prototype . addProperty ( "_alpha_tween" , _get_alpha , _set_alpha ) ; MovieClip .. addProperty prototipo ("_alpha_tween" _get_alpha, _set_alpha); |
A partir de ahora, si tenemos un símbolo "miosimbolo_mc" Podemos aprovechar esta nueva propiedad:
1
| ; miosimbolo_mc _alpha_tween = 50.; |
. ¿Qué se puede hacer en su lugar, es sobrescribir las propiedades existentes, por lo que he usado _alpha_tween lugar de _alpha . Aquí, entonces, una buena razón para seguir utilizando la versión 2.0 de clases para ampliar - y el resultado - cualquier MovieClip.
Continuación ...
Últimos Comentarios
Simon : Se molesta perturbado de nuevo y utilizar ese espacio para estas cosas ... sin embargo, no funciona ...
Giovambattista Fazioli : @ Simon: ¿qué puede ser debido a la sintaxis que utiliza, específicamente para PHP 5 +,...
Simon : He probado la noche anterior poner todo en functions.php, formas bien, jQuery, y las fichas que jQueryUI ...
Giovambattista Fazioli : @ Simon: Yo recomiendo la limpieza de ingresar un código como el de ...
Simon : @ Giovambattista Fazioli: Gracias por su paciencia, todo está claro ... ahora me siento ahora, ...