Différence de performances entre la notation par points et l'appel de méthode en Objective-C

StackOverflow https://stackoverflow.com/questions/34674

  •  09-06-2019
  •  | 
  •  

Question

Vous pouvez utiliser une notation par points standard ou un appel de méthode en Objective-C pour accéder à une propriété d'un objet en Objective-C.

myObject.property = YES;

ou

[myObject setProperty:YES];

Y a-t-il une différence de performances (au niveau de l'accès à la propriété) ?Est-ce juste une question de préférence en termes de style de codage ?

Était-ce utile?

La solution

Notation par points pour l'accès aux propriétés en Objective-C est un message envoyé, tout comme la notation entre crochets.Autrement dit, étant donné ceci :

@interface Foo : NSObject
@property BOOL bar;
@end

Foo *foo = [[Foo alloc] init];
foo.bar = YES;
[foo setBar:YES];

Les deux dernières lignes seront compilées exactement de la même manière.La seule chose qui change cela est si une propriété a un getter et/ou setter attribut spécifié ;cependant, cela ne fait que changer le message envoyé, et non si un message est envoyé :

@interface MyView : NSView
@property(getter=isEmpty) BOOL empty;
@end

if ([someView isEmpty]) { /* ... */ }
if (someView.empty) { /* ... */ }

Les deux dernières lignes seront compilées de manière identique.

Autres conseils

Vérifier article de Cocoa is My Girlfriend.L’essentiel est qu’il n’y a aucune perte de performances liée à l’utilisation de l’un par rapport à l’autre.

Cependant, la notation rend plus difficile la visualisation de ce qui se passe avec vos variables et de leurs valeurs.

La seule fois où vous constaterez une différence de performances, c’est si vous ne marquez pas une propriété comme « non atomique ».Ensuite, @synthesize ajoutera automatiquement le code de synchronisation autour du paramètre de votre propriété, en le gardant thread-safe - mais plus lent à définir et à accéder.

Ainsi, vous souhaiterez probablement probablement définir une propriété telle que :

@property (non atomique, conserver) NSString *myProp;

Personnellement, je trouve la notation par points généralement utile dans la mesure où vous n'avez pas à penser à écrire des méthodes de paramétrage correctes, ce qui n'est pas complètement trivial même pour les paramétreurs non atomiques car vous devez également vous rappeler de libérer correctement l'ancienne valeur.L'utilisation de code modèle est utile, mais vous pouvez toujours faire des erreurs et c'est généralement du code répétitif qui encombre les classes.

Un modèle à connaître :si vous définissez vous-même le setter (au lieu de laisser @synthesize le créer) et commencez à avoir d'autres effets secondaires liés à la définition d'une valeur, vous devriez probablement faire du setter une méthode normale au lieu d'appeler en utilisant la notation de propriété.

L'utilisation sémantique des propriétés semble être un accès direct à la valeur réelle pour l'appelant et tout ce qui varie de cela doit donc être fait via l'envoi d'un message, et non en accédant à une propriété (même s'ils envoient réellement tous les deux des messages).

D'après ce que j'ai vu, il n'y a pas de différence de performances significative entre les deux.Je suis raisonnablement certain que dans la plupart des cas, il sera « compilé » selon le même code.

Si vous n'êtes pas sûr, essayez d'écrire une application de test qui exécute chaque méthode un million de fois environ, tout en chronométrant le temps que cela prend.C'est la seule façon d'en être certain (même si cela peut varier selon l'architecture).

Lisez également cet article de blog sur Cocoa with Love :

http://cocoawithlove.com/2008/06/speed-test-nsmanagedobject-objc-20.html

Là, l'auteur compare la vitesse des notations d'accesseurs et de points personnalisés pour NSManagedObject et ne trouve aucune différence.Cependant, l'accès KVC (setValue:forKey:) semble être environ deux fois plus lent.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top