2012-01-09 8 views
0

Je l'ai vu aujourd'hui et je veux juste vérifier ma compréhension de ce qui se passe. "prefixName" est une propriété readonly qui utilise une méthode getter pour renvoyer directement une valeur, il n'y a pas iVar qui stocke le résultat sur l'objet PR_ViewController. De plus, si la propriété n'était pas en lecture seule, l'ajout d'un setter ne fonctionnerait toujours pas car il n'y a pas d'iVar à définir.Propriété sans méthode iVar et getter?

  • Créé: [Meth] prefixName

Par contraste "CharacterName" fonctionne de la manière habituelle pour une propriété, l'ajout d'un getter, un compositeur et un iVar.

  • Créé: [Meth] CharacterName
  • Créé: [Meth] setCharacterName
  • Créé: [iVar] CharacterName

.

@interface PR_ViewController : UIViewController 
@property (nonatomic, readonly) NSString *prefixName; 
@property (nonatomic, retain) NSString *characterName; 

.

@implementation PR_ViewController 
@synthesize characterName; 

- (NSString *)prefixName { 
    return @"FRED"; 
} 
+0

Ne dupliquez pas vos questions. S'il vous plaît fermez un de ceci. – Ilanchezhian

+0

Vous le comprenez correctement. –

+0

duplication possible de [Propriété sans méthode iVar et getter?] (Http://stackoverflow.com/questions/8788773/property-with-no-ivar-and-getter-method) – rckoenes

Répondre

7

Vous n'avez pas besoin de synthétiser des accesseurs - vous pouvez parfaitement les écrire vous-même, ce qui est fait dans votre exemple. En outre, une propriété en lecture seule ne doit pas être basée sur un ivar, mais peut être calculée en fonction d'autres ivars ou propriétés. Cela peut être utile si vous utilisez des liaisons pour afficher des valeurs dans l'interface utilisateur dérivées d'autres propriétés, à condition que vous aimiez ce style de codage.

Voici un exemple simple d'une propriété readonly calculée en fonction de deux autres propriétés:

fichier d'en-tête:

@property double width; 
@property double height; 

@property (readonly) double area; 

Mise en œuvre:

@synthesize width, height; 

- (double)area 
{ 
    return width*height; 
} 


+ (NSSet *)keyPathsForValuesAffectingArea 
{ 
    return [NSSet setWithObjects:@"width", @"height", nil]; 
} 

Maintenant, chaque fois que l'un des width ou height changements, la propriété area changements, aussi, et ses changements sont propagés à ses auditeurs (que ks à keyPathsForValuesAffectingArea.)

Vous pouvez également voir l'exemple fullName dans ce doc.

+0

Je comprends que vous pouvez écrire le getter et les setters manuellement, mais je demandais plus à propos de ne pas avoir un iVar supportant la propriété. Dans l'exemple ci-dessus, prefixName n'a pas d'iVar sur l'objet, characterName le fait. – fuzzygoat

+0

Je suppose que nous nous comprenons, mais je pense que l'ivar n'est que l'une des nombreuses façons de stocker ou de calculer la valeur de la propriété. Cela pourrait aussi être la somme d'un tableau de nombres, par exemple. – Monolo

+0

Merci, je pense que je pourrais le comprendre maintenant. Dans une situation où vous n'ajoutez pas manuellement un iVar ou n'utilisez pas @synthesis pour en générer un, vous devez ajouter manuellement les accesseurs (getter & setter). Cependant, il n'y a pas de valeur pour le getter à retourner donc vous devez en calculer un dans la méthode, comme sage avec le setter il n'y a rien à définir donc le setter est un peu redondant (à moins bien sûr que vous voulez être un peu compliqué autre chose/un autre iVar – fuzzygoat

Questions connexes