J'ai vu l'utilisation des protocoles Objective-C s'utiliser d'une manière telle que la suivante:
@protocol MyProtocol <NSObject>
@required
@property (readonly) NSString *title;
@optional
- (void) someMethod;
@end
J'ai vu ce format utilisé au lieu d'écrire une superclasse concrète que les sous-classes étendent. La question est, si vous vous conformez à ce protocole, avez-vous besoin de synthétiser vous-même les propriétés? Si vous étendez une superclasse, la réponse est évidemment non, ce n'est pas nécessaire. Mais comment gérer les propriétés auxquelles un protocole doit se conformer?
À ma connaissance, vous devez toujours déclarer les variables d'instance dans le fichier d'en-tête d'un objet conforme à un protocole qui nécessite ces propriétés. Dans ce cas, pouvons-nous supposer qu'il ne s'agit que d'un principe directeur? Clairement, ce n'est pas le cas pour une méthode obligatoire. Le compilateur vous giflera pour avoir exclu une méthode requise répertoriée par un protocole. Quelle est l'histoire des propriétés?
Voici un exemple qui génère une erreur de compilation (Remarque: j'ai réduit le code qui ne reflète pas le problème en question):
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