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

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

Tal vez cuando se utiliza LLVM 3.0 y arriba? A partir de la lectura de la red, parece que @synthesize es innecesario comenzando con Xcode 4. Sin embargo, estoy usando Xcode 4 y recibiendo advertencias cuando no @synthesize una propiedad.

Algunas de las respuestas a Por qué las propiedades no se sintetizan automáticamente parecen implicar que @synthesize se puede omitir en algún momento bajo ciertas circunstancias.

Otra sugerencia de referencia (antigua) de que @synthesize podría ser automática en algún momento en el futuro.

    A partir de clang 3.2 (alrededor de febrero de 2012), la “síntesis predeterminada” (o “síntesis de propiedad automática”) 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 característica como “habilitada, luego deshabilitada” “No sé si ese es un problema con Xcode o si los propios desarrolladores de clang han ido y venido con la pregunta).

    Hasta donde yo sé, el único caso en el que las propiedades no se sintetizarán por defecto en clang 3.2 es cuando esas propiedades se heredaron de un protocolo. Aquí hay un ejemplo:

     #import  @protocol P @property int finicky; @end @interface A : NSObject 

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

    Si comstack este ejemplo, recibirá 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 del tiempo de ejecución:

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

    A partir de Xcode 4.4, si no escribe @synthesize o @dynamic para una propiedad. el comstackdor 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 comstackdor 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 comstackdor sintetice automáticamente los descriptores de acceso de propiedad y la variable de instancia.

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

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

    De las Nuevas Características en el documento Xcode 4.4 :

    Objective-C @properties se sintetizan por defecto cuando no se implementan explícitamente.

    Entonces, @synthesize es automático de manera predeterminada a partir de Xcode 4.4 con el comstackdor LLVM 4.0.

    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.

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