137 votes

Comment gérer les protocoles d’Objective-C qui contiennent des propriétés ?

J'ai vu l'utilisation de l'Objective-C protocoles de s'habituer à un mode tels que les suivants:

@protocol MyProtocol <NSObject>

@required

@property (readonly) NSString *title;

@optional

- (void) someMethod;

@end

J'ai vu ce format utilisé à la place de l'écriture d'un béton de la superclasse que les sous-classes étendre. La question est de savoir si vous vous conformer au présent protocole, avez-vous besoin de synthétiser les propriétés de vous-même? Si vous êtes à l'extension d'une super-classe, la réponse est évidemment non, vous n'avez pas besoin. Mais comment fait-on traiter avec des propriétés d'un protocole oblige à se conformer à l'?

À ma connaissance, vous avez encore besoin de déclarer les variables d'instance dans le fichier d'en-tête d'un objet qui est conforme à un protocole qui exige de ces propriétés. Dans ce cas, peut-on supposer qu'ils sont juste un principe directeur? Clairement ce n'est pas le cas pour la méthode requise. Le compilateur va gifler votre poignet pour l'exclusion d'une méthode requise d'un protocole de listes. Quelle est l'histoire derrière propriétés?

Voici un exemple qui génère une erreur de compilation (Note: j'ai garni le code qui permet de ne pas réfléchir sur le problème à portée de main):

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

143voto

Le protocole est juste de dire que tout le monde sait au sujet de votre classe à travers le protocole, que la propriété anObject sera là. Les protocoles ne sont pas réels, ils n'ont pas de variables ou des méthodes d'eux-mêmes, ils ne font que décrire une spécfiques un ensemble d'attributs qui est vrai au sujet de votre classe ainsi que des objets ayant des références de pouvoir les utiliser de manière spécifique.

Cela signifie que dans votre classe qui est conforme à votre protocole, vous devez tout faire pour s'assurer anObject œuvres.

@bien et @synthétiser sont au cœur de deux mécanismes qui génèrent le code pour vous. @la propriété est juste en disant: il y aura un getter (et/ou setter) méthode pour que le nom de la propriété. Ces jours @biens à elle seule, suffit à ont également des méthodes et de stockage d'une variable créée pour vous par le système (que vous avez utilisé pour avoir à ajouter @sythesize). Mais vous devez avoir quelque chose d'accès et de stocker la variable.

32voto

reddersky Points 583

Voici un exemple de la mine qui fonctionne parfaitement, la définition de protocole d’abord :

Voici un exemple d’une classe prenant en charge ce protocole :

14voto

Kevlar Points 3988

vraiment, tout ce que vous avez à faire est de laisser tomber une

dans votre application et vous devrait être tous ensemble. Il fonctionne de la même manière que juste mettre la propriété dans votre interface de classe.

9voto

onmyway133 Points 2196

Jetez un oeil à mon article de la PROPRIÉTÉ DANS le PROTOCOLE

Supposons que j'ai MyProtocol qui déclare un nom de propriété, et MyClass qui est conforme à ce protocole

Des choses que la peine de noter

  1. La propriété de l'identifiant dans Maclasse déclare et génère getter, setter et la sauvegarde de _identifier variable
  2. Le nom de la propriété ne déclare que MyClass a un getter, setter dans l'en-tête. Il ne génère pas de getter, setter de la mise en œuvre et la sauvegarde de la variable.
  3. Je ne peux pas redeclare cette propriété de nom, comme elle l'a déjà déclaré par le protocole. Cela va hurler une erreur

    @interface MyClass () // Class extension
    
    @property (nonatomic, strong) NSString *name;
    
    @end
    

Comment utiliser la propriété dans le protocole

Donc pour utiliser MyClass avec le nom de la propriété, nous avons à faire, soit

  1. Déclarer la propriété (AppDelegate.h est de cette façon)

    @interface MyClass : NSObject <MyProtocol>
    
    @property (nonatomic, strong) NSString *name;
    
    @property (nonatomic, strong) NSString *identifier;
    
    @end
    
  2. Synthétiser nous-mêmes

    @implementation MyClass
    
    @synthesize name;
    
    @end
    

1voto

Luc-Olivier Points 172

Protocol Architecture

Exemple : 2 classes (personne et série) veulent utiliser le service de spectateur... et doivent être conforme à ViewerProtocol. viewerTypeOfDescription est un abonné de propriété obligatoire classes doivent se conformer.

Un autre exemple avec l’héritage de protocole sur le sous-classement

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X