4. Categorías
•Las categorías añaden métodos a clases pre-existentes.
• Son muy utilizadas para añadir métodos a clases de las frameworks, que al estar
compiladas y no tener acceso al código fuente, no serían modificables de otra
forma.
•Sólo pueden añadir métodos, no variables de instancia.
•Se suelen llamar Clase+Funcionalidad. Por ejemplo, NSArray+Random.
•Hay muchas categrías interesantes en GitHub: antes de ponerte a añadir cosas,
mira en GitHub.
5. Ejemplo de Categoría
La clase NSArray dispone de métodos para acceder a elementos específicos del
mismo, como objectAtIndex:, pero ninguno para seleccionar uno al azar.
Podríamos escribir una función específica para eso o repetir el código cada vez que
hiciese falta.
Una solución más elegante y orientada a objeto es añadirle a NSArray (y por lo tanto
a NSMutableArray que desciende de él) el método objectAtRandom.
6. Ejemplo de Categoría
•Se implementan de forma muy similar a una clase:
•Un fichero de cabecera NSArray+Random.h
•Un fichero de implementación NSArray+Random.m
11. NSArray+Random.m
#import "NSArray+Random.h"
@implementation NSArray (Random)
- (id) objectAtRandom {
int i, size;
static unsigned int seed;
// Las cabeceras que necesitan time(), srand() o random()
// son incluídas por Foundation.h
if (!seed) {
seed = time(NULL);
srand(seed);
}
size = [self count];
if (size) {
i = random() % size ;
return [self objectAtIndex: i];
}else {
return nil;
}
}
12. Protocolos
Los protocolos son listas de métodos que son compartidos por distintas
clases.
Un protocolo asegura que una clase entiende una serie de mensajes (métodos)
y podemos enviar cualquiera de esos mensajes sin riesgo y sin tener que
comprobar con respondsToSelector:.
Los protocolos se definen en unfichero de cabecera. La implementación va a
cargo de cada una de las clases que cumplen con el protocolo.
13. Implementar un Protocolo
Es muy común implementar un protocolo. La comunicación delegate funciona
implementando un protocolo.
Por ejemplo, la vista UIWebView exige que su delegado (un controlador
normalmente) implemente el protocolo UIWebViewDelegate.
Dicho protocolo consiste en los siguientes métodos típicos de un delegado (did,
will, should):
- webView:shouldStartLoadWithRequest:navigationType:
- webViewDidStartLoad:
- webViewDidFinishLoad:
- webView:didFailLoadWithError:
14. Implementar un Protocolo
Para indicar que nuestra clase implementa un protocolo, colocamos su
nombre entre <> después de la clase de la que desciende:
@interface ChiquipediaVC : UIViewController<UIWebViewDelegate> {
}
@property (retain) IBOutlet UIWebView *browser;
@property (copy) NSString *chiquiPage;
@end
15. Definir un Protocolo
Es mucho menos común y se hace en un fichero de cabecera:
@protocol Foo
-(void) doSomething: (NSString *) withThis;
@optional
-(id) getSomething;
@required
-(void) bar;
@end
16. Bloques
En Objective C son “trozos” de código que se pueden guardar en variables,
pasar como argumentos, devolver como resultado de un mensaje y ejecutar
posteriormente.
Además capturan de forma automática el entorno léxico en el que han sido
creados.
17. Uso de los bloques
1.Enumeración de colecciones
2.Ordenación (el bloque se proporciona como el método de comparación)
3.Notificación (cuando tal cosa ocurra, ejecuta este bloque)
4.Gestores de error (si ocurre un error mientras haces esto, ejecuta este
bloque)
5.Gestores de finalización (cuando termines de hacer esto, ejecuta este
bloque)
6.Animación de vistas
7.Por último, tal vez la aplicación más importante en Cocoa: multitarea
mediante “Grand Dispatch Central” (GCD).
18. Sintaxis de los bloques
1.Enumeración de colecciones
2.Ordenación (el bloque se proporciona como el método de comparación)
3.Notificación (cuando tal cosa ocurra, ejecuta este bloque)
4.Gestores de error (si ocurre un error mientras haces esto, ejecuta este
bloque)
5.Gestores de finalización (cuando termines de hacer esto, ejecuta este
bloque)
6.Animación de vistas
7.Por último, tal vez la aplicación más importante en Cocoa: multitarea
mediante “Grand Dispatch Central” (GCD).