2010-12-30 3 views
1

Nous déclarons des propriétés en utilisant le mot-clé @property et le synthétisons dans le fichier d'implémentation. Ma question est,Quelle est la meilleure façon de déclarer une propriété?

Et si je déclare une propriété en utilisant le mot-clé @property et déclare également une variable dans le bloc d'interface avec le même nom? Par exemple, considérez le code suivant,

Interface:

@interface myClass : NSObject { 

    NSString *myClass_name; // LINE 1 
} 

@property(nonatomic, retain) NSString *myClass_name; // LINE 2 

@end 

Mise en œuvre:

@implementation myClass 

@synthesize myClass_name // LINE 3 

@end 

Déclarant myClass_name en ligne 1 fera un problème? Comme tout problème de référence ou tout problème de consommation de mémoire inutile?

Répondre

3

Non, en fait, déclarer des propriétés comme cela l'attend. Vous pouvez remplacer votre déclaration:

@interface MyClass : NSObject { 
    NSString *ivar; 
} 

@property (nonatomic, retain) NSString *myClass_name; 

@end 

Et puis changer votre implémentation à

@implementation MyClass 

@synthesize myClass_name = ivar; 

@end 

(Si vous ne spécifiez pas = some_ivar, il prendra la Ivar a le même nom que la propriété .)

Vous devez toujours avoir les lignes suivantes:

  • Déclaration de la propriété (ligne 2)
  • synthétisation de la propriété (ligne 3)

Lorsque vous Synthétiser la propriété, si vous ne spécifiez pas Ivar à utiliser (en utilisant =ivar à la fin), il suppose qu'il ya un Ivar avec le même nom que la propriété.

+1

Dans ce cas, je ne ai pas besoin LINE 2? – EmptyStack

+0

@Simon Correct. –

+0

@Justin Spahr-Summers: J'ai besoin de la ligne 2 ou pas? Je ne sais vraiment pas. SVP dites-moi. – EmptyStack

1

La déclaration des propriétés et leur synthèse ne créeront aucun problème de référence dans votre cas. Cela créera des méthodes accesseur et setter pour votre variable d'instance dans votre classe. Si les noms des variables dans la propriété et celui déclaré dans la classe, alors le xcode se référera à la fois comme une seule variable.

Les lignes 3 et 4 sont obligatoires. La ligne 1 est l'optiona

+0

Quelle ligne vous entendez par Ligne 4? – EmptyStack

+0

LINE 1 est nécessaire dans mon code? – EmptyStack

+0

oh désolé mon erreur, je voulais dire ligne 2 et ligne 3 sont obligatoires. J'ai aussi essayé d'omettre la ligne 1 et d'exécuter le code. Dans votre cas, cela entraîne-t-il une erreur si vous omettez la ligne 1? – Snehal

1

J'ai obtenu le contenu suivant du document d'Apple pour Declared Properties. Je l'affiche ici, afin que cela puisse être utile pour quelqu'un à l'avenir.

Différence d'exécution

En général, le comportement des propriétés est identique sur tous les runtimes (voir Runtime Versions and Platforms en Objective-C Runtime Programming Guide). Il existe une différence clé: le runtime moderne prend en charge la synthèse des variables d'instance alors que le runtime hérité ne le fait pas. Pour @synthesize Pour fonctionner dans l'ancien runtime, vous devez fournir une variable d'instance avec le même nom et le même type compatible de la propriété ou spécifier une autre variable d'instance existante dans l'instruction @synthesize. Avec le runtime moderne, si vous ne fournissez pas de variable d'instance, le compilateur en ajoute un pour vous.Par exemple, compte tenu de la déclaration de classe suivante et la mise en œuvre:

@interface MyClass : NSObject { 

    float sameName; 
    float otherName; 
} 

@property float sameName; 
@property float differentName; 
@property float noDeclaredIvar; 

@end 


@implementation MyClass 

@synthesize sameName; 
@synthesize differentName=otherName; 
@synthesize noDeclaredIvar; 

@end 

le compilateur pour l'exécution de l'héritage générerait une erreur à @synthesize noDeclaredIvar; alors que le compilateur pour le moteur d'exécution moderne ajouterait une variable d'instance pour représenter noDeclaredIvar.

1

Ce qui suit est la manière orientée objet:

DeclaringProperties.h

@interface DeclaringProperties : NSObject 
// ivars and {} can be omitted 

@property (nonatomic, readwrite, retain) NSString *normal; 
@property (nonatomic, readwrite, retain) NSString *alias; 
@property (nonatomic, readonly, retain) NSString *readonly; 

- (id) initWithNormal:(NSString *)aNormal alias:(NSString *)alias; 

@end 

DeclaringProperties.m

#import "DeclaringProperties.h" 

// private interface 
@interface DeclaringProperties() 

@property (nonatomic, readwrite, retain) NSString *readonly; // readwrite for self 
@property (nonatomic, readwrite, retain) NSString *private; 
@property (nonatomic, readwrite, retain) NSString *retain; 

@end 

#pragma mark - 

@implementation DeclaringProperties 

@synthesize normal, alias = _alias, readonly, private, retain; 

// You can not use "normal" here; 
// But you can still use "alias", and it is highlighted in XCode! 
- (id) initWithNormal:(NSString *)aNormal alias:(NSString *)alias { 
    self = [super init]; 
    if (self) { 
     self.normal = aNormal; 
     self.alias = alias; 
     self.readonly = @"readonly"; 
     self.private = @"private"; 

     // allocated(copied) variable for retained(copied) property should be released or autoreleased 
     NSString *alloc = [[NSString alloc] init]; 
     self.retain = alloc; 
     [alloc release]; 
     // or 
     self.retain = [[NSString alloc] init]; 
     [self.retain release]; 
     // or 
     self.retain = [[[NSString alloc] init] autorelease]; 
     // I don't like ;) 
     retain = [[NSString alloc] init]; 
    } 
    return self; 
} 

- (void) dealloc { 
    self.normal = nil; 
    self.alias = nil; 
    self.readonly = nil; 
    self.private = nil; 
    self.retain = nil; 
    [super dealloc]; 
} 

@end 
Questions connexes