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