Diferencia de rendimiento entre notación de puntos y llamada a método en Objective-C

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

  •  09-06-2019
  •  | 
  •  

Pregunta

Puede utilizar una notación de puntos estándar o una llamada a un método en Objective-C para acceder a una propiedad de un objeto en Objective-C.

myObject.property = YES;

o

[myObject setProperty:YES];

¿Existe alguna diferencia en el rendimiento (en términos de acceso a la propiedad)?¿Es sólo una cuestión de preferencia en términos de estilo de codificación?

¿Fue útil?

Solución

Notación de puntos para acceso a propiedades en Objective-C es un mensaje enviado, al igual que la notación entre corchetes.Es decir, dado esto:

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

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

Las dos últimas líneas se compilarán exactamente igual.Lo único que cambia esto es si una propiedad tiene un getter y/o setter atributo especificado;sin embargo, todo lo que hace es cambiar qué mensaje se envía, no si se envía un mensaje:

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

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

Las dos últimas líneas se compilarán de forma idéntica.

Otros consejos

Verificar artículo de Cocoa es mi novia.La esencia de esto es que no hay ninguna penalización en el rendimiento por usar uno sobre el otro.

Sin embargo, la notación hace que sea más difícil ver qué está sucediendo con sus variables y cuáles son sus variables.

La única vez que verá una diferencia de rendimiento es si no marca una propiedad como "no atómica".Luego, @synthesize agregará automáticamente código de sincronización alrededor de la configuración de su propiedad, manteniéndola segura para subprocesos, pero más lenta de configurar y acceder.

Por lo tanto, probablemente desee definir una propiedad como:

@property (no atómico, retener) NSString *myProp;

Personalmente, encuentro que la notación de puntos es generalmente útil desde el punto de vista de que no tienes que pensar en escribir métodos de configuración correctos, lo cual no es completamente trivial incluso para los configuradores no atómicos porque también debes recordar liberar el valor anterior correctamente.Usar código de plantilla ayuda, pero siempre puedes cometer errores y generalmente es un código repetitivo el que satura las clases.

Un patrón a tener en cuenta:Si define el definidor usted mismo (en lugar de dejar que @synthesize lo cree) y comienza a tener otros efectos secundarios al establecer un valor, probablemente debería convertir el definidor en un método normal en lugar de llamar usando la notación de propiedad.

El uso semántico de propiedades parece ser un acceso directo al valor real para la persona que llama y cualquier cosa que varíe de eso debe hacerse enviando un mensaje, no accediendo a una propiedad (aunque en realidad ambos están enviando mensajes).

Por lo que he visto, no hay una diferencia de rendimiento significativa entre los dos.Estoy razonablemente seguro de que en la mayoría de los casos se "compilará" con el mismo código.

Si no está seguro, intente escribir una aplicación de prueba que realice cada método un millón de veces aproximadamente, mientras mide el tiempo que lleva.Esa es la única forma de estar seguro (aunque puede variar según la arquitectura).

Lea también esta publicación de blog sobre Cocoa with Love:

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

Allí, el autor compara la velocidad del descriptor de acceso personalizado y las notaciones de puntos para NSManagedObject y no encuentra ninguna diferencia.Sin embargo, el acceso a KVC (setValue:forKey:) parece ser aproximadamente el doble de lento.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top