Ho visto l'utilizzo dei protocolli Objective-C utilizzati in modo simile al seguente:
@protocol MyProtocol <NSObject>
@required
@property (readonly) NSString *title;
@optional
- (void) someMethod;
@end
Ho visto questo formato usato invece di scrivere una superclasse concreta che si estende alle sottoclassi. La domanda è: se sei conforme a questo protocollo, devi sintetizzare tu stesso le proprietà? Se stai estendendo una superclasse, la risposta è ovviamente no, non è necessario. Ma come si gestiscono le proprietà a cui un protocollo richiede la conformità?
Per quanto ne so, è ancora necessario dichiarare le variabili di istanza nel file di intestazione di un oggetto conforme a un protocollo che richiede queste proprietà. In tal caso, possiamo presumere che siano solo un principio guida? Chiaramente lo stesso non è il caso di un metodo richiesto. Il compilatore ti schiaffeggerà il polso per escludere un metodo richiesto elencato da un protocollo. Qual è la storia dietro le proprietà?
Ecco un esempio che genera un errore di compilazione (Nota: ho tagliato il codice che non riflette sul problema attuale):
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
