2008-08-29 11 views

Respuesta

19

La notación de puntos para acceso a propiedades en Objective-C es un mensaje de envío, solo como notación de 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 compilarán exactamente lo mismo. Lo único que cambia esto es si una propiedad tiene un atributo getter y/o setter especificado; Sin embargo, lo único que hace es cambiar el mensaje que 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) { /* ... */ } 

Tanto de las dos últimas líneas compilará de forma idéntica.

0

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 será 'compilado' hasta el mismo código.

Si no está seguro, intente escribir una aplicación de prueba que haga cada método un millón de veces más o menos, mientras cronometrando cuánto tiempo lleva. Esa es la única manera de estar seguro (aunque puede variar según la arquitectura).

4

Consulte article from Cocoa is My Girlfriend. La esencia de esto es que no hay una penalización en el rendimiento de 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.

4

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

Por lo tanto es probable que la mayoría desea definir una propiedad como:

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

Personalmente creo que la notación de puntos es generalmente útil desde el punto de vista de que no tiene que pensar en escribir métodos de configuración correctos, lo que no es del todo trivial incluso para instaladores no atómicos porque también debe recordar liberar el valor anterior correctamente. Usar código de plantilla ayuda, pero siempre puede cometer errores y, en general, se trata de un código repetitivo que desordena las clases.

Un patrón a tener en cuenta: si defines el setter tú mismo (en lugar de dejar que @synthesize lo cree) y comiences a tener otros efectos secundarios de establecer un valor, probablemente deberías hacer que el setter sea un método normal en lugar de llamar usando notación de propiedad.

El uso semántico de las propiedades parece ser un acceso directo al usuario real y cualquier cosa que varíe debe realizarse enviando un mensaje, no accediendo a una propiedad (aunque en realidad ambas envían mensajes).

Cuestiones relacionadas