2012-02-20 9 views
28

¿En qué condiciones es @synthesize automático en Objective-c?¿En qué condiciones es @synthesize automático en Objective-c?

¿Quizás cuando se usa LLVM 3.0 y más? De leer en la red parece que @synthesize es innecesario comenzando con Xcode 4. Sin embargo, estoy usando Xcode 4 y recibiendo advertencias cuando no tengo una propiedad de @synthesize.

Algunas de las respuestas a Why don't properties get automatically synthesized parecen implicar que @synthesize se puede omitir en algún momento bajo ciertas circunstancias.

Another (old) reference indicando que @synthesize puede ser automático en algún momento en el futuro.

+5

¿Tiene un enlace donde @synthesize se describe como innecesario? – bneely

+0

Quizás ha visto algo de información sobre el NDA Xcode 4.4 actualmente en uso y se ha confundido acerca de los números de versión. –

+1

@bneely agregó un enlace. Tal vez estoy malinterpretando "@synthesize es automático en las últimas versiones del compilador LLVM 2.0". – SundayMonday

Respuesta

11

A partir de Xcode 4.4, si no escribe @synthesize o @dynamic para una propiedad. el compilador actúa como si hubiera escrito @synthesize property = _property.

Antes de Xcode 4.4, debe hacer una de las siguientes acciones para cada propiedad o, de lo contrario, el compilador emitirá una advertencia y obtendrá un error de tiempo de ejecución. En Xcode 4.4 o posterior, puede hacer cualquiera de las siguientes cosas en lugar de dejar que el compilador sintetice automáticamente los descriptores de acceso de propiedad y la variable de instancia.

  1. Utilice la directiva @synthesize.
  2. Utilice la directiva @dynamic y de alguna forma proporcione el getter de la propiedad y (si es necesario) el setter en tiempo de ejecución.
  3. Escriba explícitamente el método getter de la propiedad y, si la propiedad es readwrite, el método setter de la propiedad.

Tenga en cuenta que puede utilizar la @synthesize directiva (o la directiva @dynamic) y también establecen explícitamente los métodos getter y/o setter. Pero @synthesize los proporciona si los omites.

+2

Si proporciona AMBOS el captador y el colocador, entonces pierde el ivar automático, ¿no? –

23

A partir de clang 3.2 (alrededor de febrero de 2012), la "síntesis predeterminada" (o "síntesis de propiedades auto") de las propiedades de Objective-C se proporciona por defecto. Es esencialmente como se describe en la publicación de blog que leyó originalmente: http://www.mcubedsw.com/blog/index.php/site/comments/new_objective-c_features/ (excepto que esa publicación describe la función como "habilitada, luego deshabilitada"; no sé si eso es un problema con Xcode o si los desarrolladores de clang sí lo han hecho y adelante en la pregunta).

Por lo que yo sé, el único caso en el que las propiedades serán no se sintetizará por defecto en clang 3.2 cuando esas propiedades se heredaron de un protocolo. He aquí un ejemplo:

#import <Foundation/Foundation.h> 

@protocol P 
@property int finicky; 
@end 

@interface A : NSObject <P> 
@property int easygoing; 
@end 

@implementation A 
@end 

int main() { A *a = [A new]; a.easygoing = 0; a.finicky = 1; } 

Si compila este ejemplo, obtendrá una advertencia:

test.m:11:17: warning: auto property synthesis will not synthesize property 
     declared in a protocol [-Wobjc-protocol-property-synthesis] 
@implementation A 
       ^
test.m:4:15: note: property declared here 
@property int finicky; 
      ^
1 warning generated. 

y si lo ejecuta, obtendrá un error de tiempo de ejecución:

objc[45820]: A: Does not recognize selector forward:: (while forwarding setFinicky:) 
Illegal instruction: 4 
4

Puede desactivar las advertencias de sintetizar haciendo clic en el nombre del proyecto en el Navegador de proyectos a la izquierda, luego haga clic en Todos combinados en Configuraciones de compilación y luego busque sintetizar. Eso debería establecerse en No.

+0

En realidad, esta es la única respuesta correcta, una respuesta anterior. El resto va a lo profundo. Asegúrese de verificar la configuración de todos sus objetivos, si tiene varios – doozMen

12

Del documento New Features in Xcode 4.4:

@properties Objective-C se sintetizan por defecto cuando no se han aplicado de forma explícita.

So @synthesize es automático por defecto a partir de Xcode 4.4 con el compilador LLVM 4.0.

+3

Tenga en cuenta que la síntesis automática no es compatible con Mac OS X de 32 bits. – ThomasW

7

Además, sintetizar no será automático si ha implementado el setter AND getter manualmente. Entonces, si se pregunta por qué no puede acceder _someVariable, al haber declarado @property (...) SomeType someVariable, entonces es porque ha implementado los métodos setSomeVariable: y someVariable.

Cuestiones relacionadas