2010-07-13 6 views
11

Estoy tratando de comprender las propiedades de Objective-C y tengo algunas preguntas persistentes sobre su sintaxis.Declaración de propiedad y asignación de almacenamiento de respaldo automático

¿Cuál es la diferencia entre declarar explícitamente un Ivar para una propiedad como esta:

@interface myObject1 : NSObject { 
    NSString *title; 
} 
@property (copy) NSString *title; 
@end 

y esto:

@interface myObject2 : NSObject { 
} 
@property (copy) NSString *title; 
@end 

El ejemplo myObject2 parece funcionar. ¿Está bien implementar propiedades como en myObject2 o debería el índice asociado siempre definirse explícitamente?

¿Cuáles son las ramificaciones de no declarar explícitamente el ivar?

+0

Lo siento por la confusión, debido a las sobre todo haciendo OSX de 32 bits, parece que olvido regularmente lo que publicó Louis. –

Respuesta

13

En el moderno Objective C runtime (nonfragile-abi) son los mismos, el respaldo ivar se creará automáticamente mediante la declaración @synthesize. Este es el tiempo de ejecución utilizado por iPhone y las aplicaciones Mac OS X de 64 bits. 32 bits Mac OS X utiliza el tiempo de ejecución heredado, donde no es posible sintetizar el ivar, y el segundo bit del código que escribió no se compilaría correctamente.

Las versiones más recientes del simulador de iPhone usan el tiempo de ejecución moderno, pero las versiones anteriores no. Por lo tanto, aunque ambos ejemplos de código funcionarán en los iPhones (sintetizando el almacenamiento necesario), el segundo ejemplo no podrá compilarse para el simulador a menos que tenga un Xcode actualizado.

+0

¿Hay alguna desventaja de no declarar explícitamente la variable de respaldo (además de los problemas de incompatibilidad con los compiladores/simuladores anteriores que mencionaste)? – Avalanchis

+0

Con los compiladores actuales, no, hay no es un inconveniente. Las cosas son un poco más complicadas si está utilizando compilaciones de desarrollo de Clang y activa los sintetizadores automáticos (-nonfragile-abi2), pero no me preocuparía por ese tipo de cosas. –

+0

Gracias tanto. Creo que mi confusión se debió principalmente al hecho de que no me di cuenta de que esta es una función de idioma relativamente nueva, por lo que no estaba claro por qué querría declarar explícitamente el ivar para una propiedad simple si no fuera necesario. – Avalanchis

2

Con el tiempo de ejecución moderno son los mismos (como ya se mencionó), excepto por el hecho de que los ivars que no están explícitamente definidos como en MyObject1 no aparecerán en el depurador cuando vea variables o pase el mouse sobre las variables, tiene que imprimir los valores de las variables o establecer el resumen de la variable en la vista de variables para mostrar las propiedades.

que empecé a usar la forma de hacer las cosas MyObject2 debido a escribir menos pero es más molesto tener que escribir en la línea de comandos gdb para ver el estado variable en el depurador :(

Cuestiones relacionadas