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
la source
Voici un exemple du mien qui fonctionne parfaitement, la définition du protocole tout d'abord:
Voici un exemple fonctionnel d'une classe prenant en charge ce protocole:
la source
tout ce que vous avez à faire est de laisser tomber un
dans votre implémentation et vous devriez être prêt. cela fonctionne de la même manière que simplement mettre la propriété dans votre interface de classe.
Éditer:
Vous voudrez peut-être le faire plus spécifiquement:
Cela correspondra à la façon dont la synthèse automatique de xcode crée des propriétés et des ivars si vous utilisez l'auto-synthèse, de sorte que si votre classe a des propriétés d'un protocole et d'une classe, certains de vos ivars n'auront pas le format différent qui pourrait avoir un impact lisibilité.
la source
synthesize
était suffisant. Cool!Jetez un œil à mon article PROPRIÉTÉ EN PROTOCOLE
Supposons que j'ai MyProtocol qui déclare une propriété de nom et MyClass qui se conforme à ce protocole
Choses à noter
Je ne peux pas redéclarer cette propriété de nom, car elle a déjà été déclarée par le protocole. Faites cela criera une erreur
Comment utiliser la propriété dans le protocole
Donc, pour utiliser MyClass avec cette propriété de nom, nous devons faire soit
Déclarez à nouveau la propriété (AppDelegate.h fait de cette façon)
Se synthétiser
la source
Exemple: 2 classes (Person et Serial) veulent utiliser le service de Viewer ... et doivent se conformer à ViewerProtocol. viewerTypeOfDescription est une propriété obligatoire que les classes d'abonné doivent se conformer.
Un autre exemple avec l'héritage de protocole sur le sous-classement
la source
La variable, anObject, doit être définie dans votre définition de classe TestProtocolsViewController, le protocole vous informe simplement qu'il devrait être là.
Les erreurs du compilateur vous disent la vérité - la variable n'existe pas. @properties ne sont que des aides après tout.
la source