2013-07-24 3 views
0

Je lis ce document pour apprendre Objective-C: https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/CustomizingExistingClasses/CustomizingExistingClasses.html#//apple_ref/doc/uid/TP40011210-CH6-SW1re-déclarer propriété ReadOnly dans les extensions de classe

I le sujet "Utiliser des extensions de classe pour masquer les informations privées" (page 73 du pdf), il dit: Class extensions are often used to extend the public interface with additional private methods or properties for use within the implementation of the class itself. It’s common, for example, to define a property as readonly in the interface, but as readwrite in a class extension declared above the implementation, in order that the internal methods of the class can change the property value directly. Ce que je ne comprends pas dans cette déclaration est que puisque nous pouvons changer la propriété readonly à partir de toute méthode privée définie dans l'extension de classe sans que cette propriété soit re-déclarée comme readwrite dans l'extension de classe, qu'est-ce qu'elle obtient par re-déclaration de cette propriété en tant que readwrite?

Répondre

0
  1. En fait, mon hypothèse selon laquelle «nous pouvons modifier la propriété readonly à partir de toute méthode privée définie dans l'extension de classe» est fausse. L'extension de classe ne peut pas utiliser les variables d'instance synthétisées automatiquement pour une propriété readonly donnée, car elles sont privées (non protégées) par défaut.
  2. Bien que le document que je mentionne indique que la variable d'instance automatiquement synthétisée pour une propriété donnée a un trait de soulignement principal (_Make) en face d'elle. Ce n'est pas vrai (du moins pas dans Xcode 4.6.3). Il porte le même nom a la propriété elle-même (à moins que vous Synthétiser la variable d'instance se @synthesize Make = _Make; S'il vous plaît me corriger si je me trompe
0

Vous pouvez toujours changer la propriété grâce à sa variable d'instance (_ivar = ...), mais vous ne serez pas en mesure de le changer en utilisant la syntaxe dot-propriété (self.myProp =...) à moins que vous redéclarez comme readwrite. Vous devrez également fournir des informations supplémentaires comme si la propriété est strong ou weak dans ce cas.

+0

J'ai une propriété comme '@property (lecture seule) NSString * Faire! Et je. était capable de le changer simplement par cette méthode d'instance: '- (void) setMyMake: (NSString *) myMake { Make = myMake; }'. Je n'ai même pas eu besoin de '_ivar' Alors pourquoi ne puis-je pas toujours utiliser 'Make = myMake;' dans toutes les méthodes d'extension de classe privée? Pourquoi dois-je faire 'self.Make = myMake;'? – PnotNP

+0

Aussi je ne sais pas pourquoi '_Make = myMake;' dit que '_Make' est un non déclaré Je suis en train de synthétiser la propriété 'Make' dans ma mise en oeuvre – PnotNP

+0

en utilisant self.myv ar = newvar vous utilisez le code autogénéré, qui traite automatiquement aussi avec le personnel de gestion de la mémoire, qui entrent en compte en particulier lorsque vous définissez une nouvelle valeur. De plus, il s'agit d'un identifiant non déclaré car vous n'avez probablement pas utilisé les extensions redéclarant comme readwrite (juste deviner). – Leonardo

Questions connexes