2013-05-09 3 views
3

Je suppose que cette question a été posée et répondue, mais j'ai lu de nombreux articles à ce sujet et je ne suis pas totalement clair sur la réponse.objectif C, propriétés vs ivars

Je trouve généralement assez pratique de déclarer des variables privées comme variables d'instance dans la section de mise en œuvre des fichiers my.m comme ceci:

@implementation ViewController { 
    int someNum; 
    NSObject *myObj; 
} 

Est-ce ok, et ou les meilleures pratiques actuellement? Dois-je déclarer des propriétés à la place pour une raison quelconque?

+0

Déclarer des variables dans le fichier .h et le rendre comme @private est un moyen de codage plus ancien. Avoir ces variables dans votre implémentation .m en fait, c'est la norme actuelle de l'industrie. – nik

Répondre

3

Une technique consiste à déclarer une extension de classe dans le .m

@interface MyViewController() { 

NSInteger someNumber; 
NSObject *myObject; 

} 

@end 

@implementation MyViewController 

-(void)someMethod { 

someNumber++; 

} 

@end 

En supposant ARC vous obtiendrez de fortes références à des types objet. Ce n'est pas différent de ce que vous avez fait. Il suffit de séparer l'interface et la mise en œuvre plus clairement et se prête également à des modèles tels que

Cependant, avec les propriétés, vous avez la possibilité de manipuler les accesseurs et vous obtenez gratuitement KVC.

@interface MyViewController() { 

    NSInteger someNumber; 

} 

@property (copy,readwrite,nonatomic) NSObject *myObject; 

@end 

@implementation MyViewController 

-(void)someMethodWhichNeedsACopy:(NSObject *)aobj { 

self.myObject = aobj; //free copies , no smudging! 

} 

@end 

Et en plus vous permet de passer outre

-(void)setMyObject:(NSObject *)aobj 

-(NSObject *)myObject 

ou tout simplement accéder au Ivar privé implicite

[_myObject doSomethingCool]; 

_myObject.thing = something; 

ou utilisez la KVC donnée à vous par les accesseurs générés

[myViewControllerInstance addObserver:someOtherObject forKeyPath:@"myObject" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:NULL] 

, après quoi someOtherObject recevront des messages de la forme

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 

En bref. Ce que vous faites n'est pas faux, mais il existe d'autres techniques et outils à explorer avec lesquels vous pouvez faire plus de choses.

+0

Très bien, merci. – Mrwolfy

+0

Utilisez essentiellement le style qui vous donne un code maintenable clair. Si vous êtes dans un concert d'entreprise encore plus. –