héritage de propriété: la synthèse de propriété automatique ne synthétisera pas la propriété
Résumé:
Cette question est à propos de l'héritage de propriétés en combinaison avec différents de lecture/écriture accède de l'intérieur et à l'extérieur des classes héritant de la propriété de l'un à l'autre.
Détails:
J'ai une classe A
et une autre classe B
qui hérite de l' A
. Il est la propriété someProperty
déclaré dans A
. Je veux le bien pour être en lecture seule à partir en dehors de ces classes et de lecture/écriture à partir de l'intérieur.
Avec une seule classe, c'est très simple: Vous déclarer la propriété dans la .h
en readonly et vous déclarer en tant que readwrite dans le .m à l'intérieur d'une catégorie. Fait.
Mais avec les deux classes, l'une découlant de l'autre, j'ai le dessous d'avertissement du compilateur dans B
:
La propriété d'Auto synthèse ne sera pas synthétiser de la propriété 'someProperty'
parce que c'est "readwrite", mais il sera synthétisé 'readonly' via
une autre propriété
Voici le code:
A. h:
#import <Foundation/Foundation.h>
@interface A : NSObject
//This property shall be readonly from outside, but read/write from subclasses
@property (readonly) SInt32 someProperty;
@end
A. m:
#import "A.h"
@implementation A
@end
B. h:
#import <Foundation/Foundation.h>
#import "A.h"
@interface B : A
@end
B. m:
#import "B.h"
@interface B ()
//compiler warning in the following property declaration:
///Users/.../B.m:12:41: Auto property synthesis will not synthesize property
//'someProperty' because it is 'readwrite' but it will be synthesized
//'readonly' via another property
@property (readwrite) SInt32 someProperty;
@end
@implementation B
@end
Pourquoi cet avertissement apparaît et comment dois-je organiser mon code pour l'éviter?
source d'informationauteur Daniel S. | 2014-07-04
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin de déclarer la propriété en lecture-écriture sur le propriétaire de la classe (
A
), puis redeclare sur la sous-classe (B
) pour faire le compilateur conscient que vous souhaitez utiliser. Donc,A
hôtes la méthode d'accesseur etB
l'utilise. En général, vous ne voulez pasB
pour créer une autre méthode d'accesseur de sorte que vous pouvez utiliser@dynamic
pour indiquer au compilateur que la super-classe (techniquement, juste une autre classe) assurera la mise en œuvre.Notez que vous pouvez également déclarer une catégorie (pas d'extension) sur
A
dansB
.m qui déclare la méthode d'accesseur explicitement (pas d'utiliser une propriété, une méthode) qu'est ce que vous êtes réellement intéressé (vous n'avez pas vraiment envie à toute autre chose qu'un bien précise, et vous ne voulez pas vraiment le temps de maintenance de veiller à ce que la propriété des attributs de match dans les super et la sous-classe)...