Publicado el 16 de Julio del 2019
879 visualizaciones desde el 16 de Julio del 2019
13,3 MB
64 paginas
Creado hace 15a (21/05/2009)
Universidad de Salamanca
IHM - Objective-C
jueves 21 de mayo de 2009
Depto. Informática y Automática
Máster en Sistemas Inteligentes
Dr. J.R. García-Bermejo Giner
Segunda parte - Objective-C
===========================
Vamos a estudiar brevemente el lenguaje Objective-C
- Mecanismo de declaración de clases.
- Mecanismo de declaración de categorías.
- Mecanismo de declaración de protocolos.
- Otros mecanismos.
jueves 21 de mayo de 2009
IHM - Objective-CPrimeros pasos en Objective-C
- Hola, Mundo! (manual)
- Hola, Mundo! (XCode)
El compilador de Objective-C está disponible en gnuc, pero la biblioteca de clases asociada debe instalarse por
separado salvo en Mac OS X.
Una dirección curiosa: http://blog.lyxite.com/2008/01/compile-objective-c-programs-using-gcc.html
jueves 21 de mayo de 2009
IHM - Objective-CNotas
=====
Los signos diacríticos y en general los códigos ASCII extendidos requieren acuerdo
entre el formato del código fuente y la terminal empleada. (DEMO)
Objective-C conoce y utiliza UTF8.
- Hola, Mundo! (manual)
gcc -L /System/Library/Frameworks/Foundation.framework/Foundation *.m
- Hola, Mundo! (XCode) (ver)
El compilador de Objective-C está disponible en gnuc, pero la biblioteca de clases asociada debe instalarse por
separado salvo en Mac OS X.
Una dirección curiosa: http://blog.lyxite.com/2008/01/compile-objective-c-programs-using-gcc.html
jueves 21 de mayo de 2009
IHM - Objective-CUn programa completo en Objective-C
Archivo: ListaDeAlimentos.h
#import <Cocoa/Cocoa.h>
#import <AppKit/NSGraphics.h>
@interface ListaDeAlimentos : NSObject {
}
NSMutableDictionary * lista;
@property(readonly) NSMutableDictionary * lista;
-(id)init;
-(float)caloriasPorCienGramosDe:(NSString*)alimento;
-(void)registrar:(NSString*)alimento caloriasPorCienGramos:(float)valor;
-(void)eliminar:(NSString*)alimento;
@end
jueves 21 de mayo de 2009
IHM - Objective-CUn programa completo en Objective-C
Archivo: ListaDeAlimentos.m
NSString * calorias = [lista objectForKey:alimento];
return calorias ? [calorias floatValue] : -1.0;
super init];
lista = [[NSMutableDictionary alloc] init];
return self;
#import "ListaDeAlimentos.h"
@implementation ListaDeAlimentos
@synthesize lista;
-(id)init {
[
}
-(float)caloriasPorCienGramosDe:(NSString*)alimento {
}
-(void)registrar:(NSString*)alimento caloriasPorCienGramos:(float)valor {
[
}
-(void)eliminar:(NSString*)alimento {
}
@end
NSString * copia = [alimento copy];
lista setObject:[NSNumber numberWithFloat:valor] forKey:copia];
lista removeObjectForKey:alimento];
if(alimento)
[
else
NSBeep();
jueves 21 de mayo de 2009
IHM - Objective-CUn programa completo en Objective-C
Archivo: Calorimetro.m
#import <Foundation/Foundation.h>
#import <AppKit/NSGraphics.h>
#import "ListaDeAlimentos.h"
ListaDeAlimentos * p = [[ListaDeAlimentos alloc] init];
NSMutableDictionary * listaAlmacenada = p.lista;
[p registrar:@"Fresas" caloriasPorCienGramos:35.0];
[p registrar:@"Moras" caloriasPorCienGramos:59.0];
int main (int argc, const char * argv[]) {
{
for(id alimento in listaAlmacenada)
printf("Alimento: %-10s ---> Calorías: %5.1f\n", [alimento UTF8String],
[[listaAlmacenada objectForKey:alimento] floatValue]);
}
}
return 0;
jueves 21 de mayo de 2009
IHM - Objective-CUn programa completo en Objective-C - Resultado de la ejecución de este programa
[Session started at 2008-06-07 19:18:26 +0200.]
Alimento: Fresas ---> Calorías: 35.0
Alimento: Moras ---> Calorías: 59.0
The Debugger has exited with status 0.
jueves 21 de mayo de 2009
IHM - Objective-CComentarios
===========
- Se ha utilizado un ejemplar de NSMutableDictionary como estructura de datos para
almacenar información.
- Se ha empleado la sintaxis de propiedades para acceder a lista.
- Se ha enviado el mensaje registrar:caloriasPorCienGramos: a un ejemplar de
ListaDeAlimentos.
- Se ha empleado la sintaxis de enumeración rápida (iteradores) para recorre la
lista de parejas plato/calorías.
- Se han efectuado conversiones a formatos imprimibles.
jueves 21 de mayo de 2009
IHM - Objective-CDeclaración de clases en Objective-C
====================================
Las clases constan de interfaz e implementación; normalmente se escribe la interfaz en
un archivo de encabezado (.h) y la implementación en un archivo de implementación (.m).
El contenido de un archivo de interfaz (NombreDeLaClase.h) es como sigue:
@interface NombreDeLaClase : NombreDeLaSuperclase <NombreProtocolo_01,...> {
// class NombreDeLaClase extends NombreDeLaSuperclase implements NombreProtocolo...
// Zona de declaración de variables de ejemplar (no hay variables de clase!)
-(tipo_1) variableDeEjemplar_1;
...
-(tipo_M) variableDeEjemplar_N;
}
// Zona de declaración de métodos
+(tipo) metodoDeclase;
...
-(tipo) metodoDeEjemplar:(tipo)argumento etiqueta:(tipo)otroArgumento;
@end
jueves 21 de mayo de 2009
IHM - Objective-CDeclaración de clases en Objective-C
====================================
Archivo: NombreDeLaClase.h
En la zona de declaración de variables de ejemplar se admite la presencia de cuatro
indicadores de ámbito:
@private - visible en métodos de la clase únicamente.
@protected - visible en métodos de la clase y de descendientes directos (por defecto).
@public - visible en cualquier método de cualquier clase (no se recomienda).
@package - en máquinas de 64 bits, equivale a @public dentro de la misma imagen
en que se implementa la clase, pero fuera de esa imagen es como @private.
Por omisión, todas las variables de ejemplar se encuentran en la zona @protected
@interface NombreDeLaClase : NSObject {
-(tipo_1) variableDeEjemplar_1; // protegida
@private
-(tipo_2) variableDeEjemplar_2; // privada
@protected
-(tipo_3) variableDeEjemplar_3; // protegida
@package
-(tipo_4) variableDeEjemplar_4; // de paquete
@public
-(tipo_M) variableDeEjemplar_N; // pública, no se recomienda
}
// Zona de declaración de métodos
...
jueves 21 de mayo de 2009
IHM - Objective-CDeclaración de clases en Objective-C
====================================
Archivo: NombreDeLaClase.h
Tras la llave que marca el fin de la zona de declaración de variables se halla la zona
de declaración de métodos. Hay dos tipos de métodos:
-- de clase
+(id) alloc;
+(id) init;
+(id) initWithValue:(id)someValue;
-- de ejemplar
-(void)setVariable:(tipo)valor;
-(float)sumaDeValores;
-(NSMutableArray*)contenido:(id)obj desdeAqui:(int)desde hastaAqui:(int)hasta;
Los métodos de clase (init, alloc) sirven para reservar memoria para nuevos ejemplares
y para dar valores iniciales a esos ejemplares. Los métodos de ejemplar actúan sobre
las variables de ejemplar, son los métodos habituales de una clase.
jueves 21 de mayo de 2009
IHM - Objective-CDeclaración de clases en Objective-C
====================================
Archivo: NombreDeLaClase.h
La forma de declarar el tipo proporcionado por un método, y los argumentos que recibe
es peculiar. El tipo proporcionado se coloca a la derecha del signo +/- (método de
clase o de ejemplar), y va entre paréntesis. Los argumentos no van entre paréntesis a
la derecha del nombre del método. Se declaran en la forma
etiqueta : (tipo) nombreDeArgumento
El nombre del método hace las veces de etiqueta del primer argumento. La etiqueta se
utiliza después en la llamada al método, permitiendo al usuario recordar fácilmente el
significado del argumento. Véanse algunos ejemplos de declaración de métodos.
-(float)sumaDeValores;
-(void)setVariable:(tipo)valor;
-(NSMutableArray*)contenido:(id)obj desdeAqui:(int)desde hastaAqui:(int)hasta;
Estos métodos se invocarían en la forma siguiente:
suma = [objeto sumaDeValores];
otroObjeto.Variable=33;
NSMutableArray * c = [unObjeto contenido:otroObjeto desdeAqui:33 hastaAqui:44];
jueves 21 de mayo de 2009
IHM - Objective-CDeclaración de clases en Objective-C
====================================
Archivo: NombreDeLaClase.m
El archivo de implementación importa al de interfaz, salvo que residan en un mismo
fichero. A continuación se especifica la implementación de los métodos declarados.
#import “NombreDeLaClase.h”
@implementation NombreDeLaClase // No es preciso repetir superclase y protocolos
+(id) init {
[super init];
...
return self;
...
}
...
-(tipo)nombreDeMetodo {
}
...
-(otroTipo)otroMetodo:(tipo)argumento conOtroParametro:(tipo)valor {
}
...
@end
Los métodos ven todas las variables de ejemplar. Se cuenta con los identificadores
automáticos self (como this) y super (que denota la clase precedesora).
jueves 21 de mayo de 2009
IHM - Objective-CEl mecanismo de herencia
========================
Objective-C ofrece un mecanismo de herencia simple. Las variables y métodos
pertenecientes a la clase predecesora también son visibles en las clases derivadas, en
las derivadas de éstas (“nietas”), etc. El especificador de ámbito @protected limita la
visibilidad de esa manera precisamente.
La sintaxis es como sigue:
@interface NombreDeClaseDerivada : NombreDeClasePredecesora {
}
@end
Si se envía un mensaje a una clase y no puede responder a él por no estar implementado
ese método en esa clase, se asciende por la jerarquía de herencia hasta hallar y
ejecutar ese método, o hasta llegar a NSObject.
Las clases derivadas pueden añadir nuevas variables y métodos.
En caso de colisión, se puede acceder a las variables y métodos de la clase predecesora
empleando la palabra reservada super.
Las clases derivadas pueden redefinir métodos de las clases predecesoras. Si se envía
un mensaje a la clase derivada, se ejecutará el método definido en esa clase derivada.
jueves 21 de mayo de 2009
IHM - Objective-CEl mecanismo de herencia
========================
Los punteros de las clases predecesoras y de las derivadas son compatibles. Pero el
punto de entrada para buscar métodos es siempre el real, es decir, el conjunto de
métodos definidos en el puntero de que se disponga.
Si se asigna a un puntero de cl
Comentarios de: Objective C (0)
No hay comentarios