Que signifie cet avertissement de synthèse de propriété d'objectif-c?
Depuis la mise à jour de Xcode 5.1, je commence à voir l'avertissement suivant dans le code de mon projet. J'essaie de comprendre ce que cela signifie.
Avertissement: Auto property synthesis will not synthesize property 'responseHeader' because it is 'readwrite' but it will be synthesized 'readonly' via another property
Le code où il est survenu, dans la .m fichier:
@interface S3Response ()
@property (nonatomic, readwrite, retain) NSDictionary *responseHeader;
@end
La déclaration précédente de la propriété, dans l' .h fichier:
@property (nonatomic, readonly) NSDictionary *responseHeader;
Il n'y a pas de @synthesize
déclaration de propriété, ni responseHeader
ou setResponseHeader
définis comme des méthodes. Cependant, il existe une définition explicite d'un ivar nommé responseHeader
.
Semble assez simple pour moi: la propriété est déclarée comme étant en lecture seule pour les utilisateurs de la classe, mais en lecture-écriture au niveau local afin que la classe peut définir.
Que fait cet avertissement veux dire, et que dois-je faire à ce sujet?
source d'informationauteur dpassage | 2014-03-16
Vous devez vous connecter pour publier un commentaire.
Que le code semble être de la AWS SDK pour iOS
et
S3Response
est une sous-classe deAmazonServiceResponse
.Le public
AmazonServiceResponse
interface définit une propriété en lecture seulequi est redéfini comme en lecture-écriture dans une classe de l'extension dans le fichier d'implémentation:
Maintenant la sous-classe
S3Response
veut également lire-écrire l'accès à cette propriété,et, par conséquent, définit également dans la classe de l'extension de sa mise en œuvre de fichier:
Le compilateur se plaint parce que – lors de la compilation "S3Response.m" – il ne sait pas
qu'un setter pour le bien existe dans la super-classe (il ne lit pas
le mise en œuvre de fichier de la super-classe à ce point). Aussi le compilateur ne peut pas
simplement synthétiser un setter dans la sous-classe, car il ne peut pas ne pas savoir que le
la propriété est soutenue par une variable d'instance de la super-classe.
Mais vous savez qu'un setter sera généré, de sorte que vous pouvez supprimer l'avertissement par
l'ajout d'un
@dynamic
déclaration à la sous-classe de mise en œuvre:@dynamic
est une "promesse" au compilateur que toutes les méthodes d'accès seraêtre disponible au moment de l'exécution.
Ici, le problème est comme suit.
Par défaut, si vous n'êtes pas écrire à la propriété (faible/conserver/strong/assign) explicitement, xCode va vérifier le type automatiquement. Ainsi dans le cas de NSDictionary il sera forte. Ainsi, dans l'interface, vous aurez
Puis il sera de vous contredire privé, mise en œuvre définition
Compilateur ne correspond pas forte et de conserver en vertu de la propriété de synthétiser s'il est formellement la même chose.
Pour guérir situation, vous pouvez écrire conserver dans les deux cas, ou plus correctes, vous ne devriez pas écrire à conserver à tout. Elle sera forte par défaut dans les deux définitions.