Quelles sont les différences entre l'implémentation d'un @property
avec @dynamic
ou @synthesize
?
559
Quelles sont les différences entre l'implémentation d'un @property
avec @dynamic
ou @synthesize
?
@synthesize générera des méthodes getter et setter pour votre propriété. @dynamic indique simplement au compilateur que les méthodes getter et setter ne sont pas implémentées par la classe elle-même mais ailleurs (comme la superclasse ou seront fournies lors de l'exécution).
Les utilisations de @dynamic sont par exemple avec des sous-classes de NSManagedObject
(CoreData) ou lorsque vous souhaitez créer une sortie pour une propriété définie par une superclasse qui n'a pas été définie comme sortie.
@dynamic peut également être utilisé pour déléguer la responsabilité de la mise en œuvre des accesseurs. Si vous implémentez les accesseurs vous-même dans la classe, vous n'utilisez normalement pas @dynamic.
Super classe:
@property (nonatomic, retain) NSButton *someButton;
...
@synthesize someButton;
Sous-classe:
@property (nonatomic, retain) IBOutlet NSButton *someButton;
...
@dynamic someButton;
NSUnknownKeyException
erreurs avec ma propriété dynamique lorsque j'ai supprimé la@synthesize
ligne (Xcode 3.2 me donnait une erreur b / c je n'avais pas d'ivar correspondant pour mon @property). L'ajout a@dynamic
résolu le problème - se compile et fonctionne bien maintenant. Merci!@property
éléments qui n'ont ni@synthesize
ne@dynamic
seront synthétisés automatiquement. Pour chaque propriété, un ivar avec un soulignement de tête, par exemple,_propertyName
sera créé, avec le getter et le setter appropriés.Jetez un oeil à cet article ; sous la rubrique "Méthodes fournies lors de l'exécution":
La
@synthesize
directive, d'autre part, génère les méthodes d'accesseur pour vous au moment de la compilation (bien que comme indiqué dans la section "Mixage des accesseurs synthétisés et personnalisés", elle est flexible et ne génère pas de méthodes pour vous si l'une ou l'autre est implémentée).la source
Comme d'autres l'ont dit, en général, vous utilisez @synthesize pour que le compilateur génère les getters et / ou les paramètres pour vous, et @dynamic si vous allez les écrire vous-même.
Il y a une autre subtilité pas encore mentionné: @synthesize va vous permettre de fournir une implémentation vous, soit d' un getter ou un setter. Ceci est utile si vous souhaitez uniquement implémenter le getter pour une logique supplémentaire, mais laissez le compilateur générer le setter (qui, pour les objets, est généralement un peu plus complexe à écrire vous-même).
Cependant, si vous écrivez une implémentation pour un accesseur @ synthétisé, elle doit toujours être soutenue par un champ réel (par exemple, si vous écrivez,
-(int) getFoo();
vous devez avoir unint foo;
champ). Si la valeur est produite par autre chose (par exemple calculée à partir d'autres champs), vous devez utiliser @dynamic.la source
@dynamic
si vous allez les écrire vous-même" Non, vous n'utilisez PAS dynamique si vous les écrivez vous-même.@dynamic
désactive la vérification du compilateur pour vous assurer que vous les avez implémentés. Si vous les avez implémentés vous-même, vous voulez que le compilateur vérifie.@dynamic est généralement utilisé (comme cela a été dit ci-dessus) lorsqu'une propriété est créée dynamiquement au moment de l'exécution. NSManagedObject le fait (pourquoi toutes ses propriétés sont dynamiques) - ce qui supprime certains avertissements du compilateur.
Pour une bonne vue d'ensemble sur la façon de créer des propriétés dynamiquement (sans NSManagedObject et CoreData:, voir: http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtDynamicResolution.html#// apple_ref / doc / uid / TP40008048-CH102-SW1
la source
voici un exemple de @dynamic
la source
Selon la documentation:
https://developer.apple.com/library/mac/documentation/cocoa/conceptual/ObjCRuntimeGuide/Articles/ocrtDynamicResolution.html
@dynamic indique au compilateur que les méthodes d'accesseur sont fournies au moment de l'exécution.
Avec un peu d'investigation, j'ai découvert que la fourniture de méthodes d'accesseur remplaçait la directive @dynamic.
@synthesize dit au compilateur de créer ces accesseurs pour vous (getter et setter)
@property indique au compilateur que les accesseurs seront créés, et que l'on peut y accéder avec la notation par points ou [message d'objet]
la source
Une chose à ajouter est que si une propriété est déclarée comme @dynamic, elle n'occupera pas de mémoire (j'ai confirmé avec l'instrument d'allocation). Une conséquence est que vous pouvez déclarer une propriété dans la catégorie de classe.
la source
Selon la documentation Apple.
Vous utilisez l'
@synthesize
instruction dans le bloc d'implémentation d'une classe pour indiquer au compilateur de créer des implémentations qui correspondent à la spécification que vous avez donnée dans la@property
déclaration.Vous utilisez l'
@dynamic
instruction pour indiquer au compilateur de supprimer un avertissement s'il ne trouve pas une implémentation des méthodes d'accesseur spécifiées par une@property
déclaration.Plus d'informations:-
https://developer.apple.com/library/ios/documentation/General/Conceptual/DevPedia-CocoaCore/DeclaredProperty.html
la source