50 votes

Swift 3 - dynamique vs @objc

Quelle est la différence entre le marquage d'une méthode telle que @objc vs dynamique, quand souhaitez-vous faire un vs l'autre?

Ci-dessous d'Apple définition dynamique.

dynamique Appliquer cette option à tout membre d'une classe qui peut être représenté par Objective-C. Lorsque vous marquez une déclaration d'un membre avec la dynamique de modificateur d'accès à ce membre est toujours dynamiquement distribué à l'aide de l'Objective-C runtime. L'accès à ce membre est jamais inline ou devirtualized par le compilateur.

Parce que les déclarations marqué avec la dynamique modificateur sont expédiés à l'aide de l'Objective-C runtime, ils sont implicitement marqué avec l'objc attribut.

89voto

kkoltzau Points 444

Une fonction/variable déclarée comme @objc est accessible à partir d'Objective-C, mais Swift continue d'y accéder directement via statique ou virtuel de l'expédition. Cela signifie que si la fonction/variable est swizzled via l'Objective-C cadre, à l'instar de ce qui se passe lors de l'utilisation de la Clé-Valeur de l'Observer ou de les différents Objective-C Api pour modifier les classes, l'appel de la méthode rapide et Objective-C va produire des résultats différents.

À l'aide de dynamic dit Swift de toujours se référer à Objective-C répartition dynamique. Cela est nécessaire pour des choses comme la Clé-Valeur d'Observer pour fonctionner correctement. Lorsque la Swift fonction est appelée, elle se réfère à l'Objectif-C runtime dynamiquement l'envoi de l'appel.

16voto

XAleXOwnZX Points 159

Comme cette citation dit, dynamic implique @objc.

Sauf si vous spécifiez une classe comme étant dynamic, le compilateur est libre pour optimiser loin et dans la ligne de ses méthodes. Cela apporte d'énormes avantages de performance, mais cela signifie que vous ne pouvez pas modifier ces implémentations de méthode au moment de l'exécution. Si vous avez l'intention de perdre son temps avec ces méthodes lors de l'exécution à l'aide de la réflexion des capacités de l'Objectif C runtime, vous devez utiliser dynamic. Vous devrez payer une pénalité sur les performances (votre code sera exécuté à l'Objectif C niveaux de vitesse, plutôt que près de C-comme les niveaux), mais vous aurez un gain supplémentaire de dynamisme.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X