2010-07-31 4 views
17

Je souhaite définir un protocole avec peu de propriétés et avoir besoin d'utiliser ces propriétés dans une autre sous-classe NSObject. S'il vous plaît donnez-moi un lien ou un exemple de code. J'ai besoin de ça pour travailler avec 10.5.Comment définir et implémenter les propriétés dans le protocole

Merci S'IL VOUS PLAÎT VOIR L'exemple de code

@protocol MyProtocol 
@property (nonatomic, readonly) id someObject; 
@property (nonatomic, getter=isAlive) BOOL alive; 
@end 

#import "MyProtocol.h" 
@interface MyCustomClass : NSObject <MyProtocol>{ 

} 
@end 

#import "MyCustomClass.h" 
@implementation MyCustomClass 
@synthesize someObject,alive; 

/* 
- (id)someObject { 
    return nil; 
} 

- (BOOL)isAlive { 
    return YES; 
} 

- (void)setAlive:(BOOL)aBOOL { 
} 
*/ 
@end 

** Ajouté: Code Compling avec l'architecture x86_64 fonctionne très bien. Mais l'erreur si je vais changer l'architecture i386, alors je reçois des avertissements suivants:.

MyCustomClass.m:13: error: synthesized property 'someObject' must either be named the same as a compatible ivar or must explicitly name an ivar 

error: synthesized property 'alive' must either be named the same as a compatible ivar or must explicitly name an ivar 

Je veux juste savoir pourquoi il travaille en x86_64 avec @synthesize et non dans i386 **

Répondre

33

@property indique simplement au compilateur que la classe doit définir les méthodes pour correspondre à cette propriété.

@protocol MyProtocol 
@property (nonatomic, readonly) id someObject; 
@property (nonatomic, getter=isAlive) BOOL alive; 
@end 

Tout mettre en œuvre ce protocole devra désormais avoir

- (id)someObject; 
- (BOOL)isAlive; 
- (void)setAlive:(BOOL)aBOOL; 
+9

La synthèse des propriétés devrait également fonctionner, car elle indique au compilateur de fournir les implémentations de la méthode d'accès. –

+0

Merci, votre code fourni fonctionne parfaitement, si je garde l'architecture du projet à x86_64. Si je change l'architecture en i386 alors j'obtiens des avertissements suivants: MyCustomClass.m: 13: erreur: la propriété synthétisée 'someObject' doit soit être nommée comme un ivar compatible ou doit explicitement nommer un ivar erreur: synthétisé La propriété 'alive' doit être nommée de la même manière qu'un ivar compatible ou doit explicitement nommer un ivar Je veux juste savoir pourquoi cela fonctionne en x86_64 avec @synthesize et non en i386. Merci – AmitSri

+0

J'essaie d'écrire moins de code si possible. Veuillez m'expliquer aussi quelle est la différence entre différentes architectures et laquelle je suppose choisir de compiler l'application. – AmitSri

1

Je pense que les choses que vous avez affaire sont principalement des effets secondaires de l'introduction de Objective-C 2.0. Cela vous permet de faire des choses comme déclarer des propriétés sans définir de variables d'instance. Mais (comme vous l'avez découvert), il est seulement compatible avec x86_64 et post-10.5.

+0

J'ai une erreur similaire. J'ai coché la case "built active architecture only" pour x86_64. Il l'a réparé. – user523234

Questions connexes