He visto que el uso de los protocolos Objective-C se usa de una manera como la siguiente:
@protocol MyProtocol <NSObject>
@required
@property (readonly) NSString *title;
@optional
- (void) someMethod;
@end
He visto este formato usado en lugar de escribir una superclase concreta que las subclases extiendan. La pregunta es, si cumple con este protocolo, ¿necesita sintetizar las propiedades usted mismo? Si está extendiendo una superclase, la respuesta es obviamente no, no es necesario. Pero, ¿cómo se manejan las propiedades que un protocolo requiere para cumplir?
Según tengo entendido, aún necesita declarar las variables de instancia en el archivo de encabezado de un objeto que se ajusta a un protocolo que requiere estas propiedades. En ese caso, ¿podemos suponer que son solo un principio rector? CLARAMENTE lo mismo no es el caso para un método requerido. El compilador le dará una palmada en la muñeca por excluir un método requerido que enumera un protocolo. Sin embargo, ¿cuál es la historia detrás de las propiedades?
Aquí hay un ejemplo que genera un error de compilación (Nota: he recortado el código que no refleja el problema en cuestión):
MyProtocol.h
@protocol MyProtocol <NSObject>
@required
@property (nonatomic, retain) id anObject;
@optional
TestProtocolsViewController.h
- (void)iDoCoolStuff;
@end
#import <MyProtocol.h>
@interface TestProtocolsViewController : UIViewController <MyProtocol> {
}
@end
TestProtocolsViewController.m
#import "TestProtocolsViewController.h"
@implementation TestProtocolsViewController
@synthesize anObject; // anObject doesn't exist, even though we conform to MyProtocol.
- (void)dealloc {
[anObject release]; //anObject doesn't exist, even though we conform to MyProtocol.
[super dealloc];
}
@end
fuente
Aquí hay un ejemplo mío que funciona perfectamente, la definición del protocolo en primer lugar:
A continuación se muestra un ejemplo funcional de una clase que admite este protocolo:
fuente
todo lo que tienes que hacer es soltar un
en su implementación y ya debería estar listo. funciona de la misma manera que simplemente colocando la propiedad en su interfaz de clase.
Editar:
Es posible que desee hacer esto más específicamente:
Esto coincidirá con la forma en que la síntesis automática de xcode crea propiedades e ivars si usa la síntesis automática, de modo que si su clase tiene propiedades de un protocolo y una clase, algunos de sus ivars no tendrán el formato diferente que podría afectar legibilidad.
fuente
synthesize
era suficiente. ¡Frio!Echa un vistazo a mi artículo PROPIEDAD EN PROTOCOLO
Supongamos que tengo MyProtocol que declara una propiedad de nombre y MyClass que se ajusta a este protocolo
Cosas que vale la pena notar
No puedo volver a declarar esta propiedad de nombre, como ya lo declaró el protocolo. Hacer esto gritará un error
Cómo usar la propiedad en el protocolo
Entonces, para usar MyClass con esa propiedad de nombre, tenemos que hacer
Declare la propiedad nuevamente (AppDelegate.h lo hace de esta manera)
Sintetizarnos
fuente
Ejemplo: 2 clases (Persona y Serie) desean usar el servicio de Viewer ... y deben cumplir con ViewerProtocol. viewerTypeOfDescription es una propiedad obligatoria que las clases de suscriptores deben cumplir.
Otro ejemplo con herencia de protocolo sobre subclases
fuente
La variable, unObjeto, debe definirse en su definición de clase TestProtocolsViewController, el protocolo solo le informa que debería estar allí.
Los errores del compilador te dicen la verdad: la variable no existe. @properties son solo ayudantes después de todo.
fuente