2010-07-30 3 views
2

Juste à expérimenter avec @property et @synthesize:cocoa2.0-t @property obvier déclaration de variable dans l'interface

@interface Greeter : NSObject 
//{ 
// NSString * name; 
//} 
@property (assign) NSString * name; 
- (NSString *) greeting; 
@end 

Il semble être le cas que si vous déclarez une variable en utilisant @property que vous ne « t doivent déclarer entre les accolades (et vous ne même pas besoin des accolades si toutes vos variables d'interface sont toutes déclarées à l'aide @property). Est-ce toujours correct? Et est-ce un bon style de laisser de côté la partie supérieure de l'interface (accolades incluses)? J'ai utilisé les deux et été irrité par la redondance.

Répondre

2

Il n'y a pas « Cocoa 2.0 ».

En Objective-C 2.0, sur the modern runtime, oui, vous pouvez omettre les variables d'instance, et la propriété les générera pour vous. The legacy runtime sur Mac OS X nécessite toujours des variables d'instance explicites.

Vous ne pouvez pas omettre entièrement la section ivar , mais vous pouvez la laisser vide.

+0

Quelles sont les meilleures pratiques pour cela? Laissez-le dehors pour le rendre propre, ou gardez-le dans l'intérêt de l'explicité? –

+0

@Jess Bowers: Je les laisse actuellement afin de les référencer '' init' et dealloc', mais commencer à les quitter après Clang 2.0. –

0

Voici la page Web où j'ai découvert que vous pouvez automatiquement vous propriétés synthétisées et déclarer également de nouvelles propriétés dans les extensions de classe. Cela donne aussi un peu d'histoire intéressante.

http://www.mcubedsw.com/blog/index.php/site/comments/new_objective-c_features/

En ce qui concerne le style et l'exactitude, je l'ai utilisé principalement pour les propriétés des deux dernières semaines et il a fait mon code semble assez propre! Je peux maintenant déclarer des propriétés privées dans mon implémentation et ne pas les exposer dans l'en-tête rendant toute interface pour utiliser mes classes très simple et non confuse à utiliser.

J'ai rencontré un problème lors de l'utilisation de l'interface de construction où un iVar à toutes les sous-vues d'un contrôleur de vue doit encore être déclaré dans l'en-tête pour constructeur d'interface pour le voir comme IBOutlet et lui assigner. Vous pouvez toujours déclarer les @private bien et ont les propriétés privées déclarées dans une extension de classe dans votre implémentation si vous voulez vraiment comme une propriété pour vous d'utiliser.

// In your header 
@interface MenuViewController : UIViewController { 
    @private 
    IBOutlet UIButton *buttonPeopleShouldNotKnowAbout; 
} 
@end 

// And in your implementation 
@implementation MenuViewController() 
@property (nonatomic, readwrite, assign) IBOutlet UIButton *buttonPeopleShouldNotKnowAbout; 
@end