tutorial objective cox caracteristicas brad objective-c llvm synthesize

objective-c - cox - objective c vs swift



¿Bajo qué condiciones es @synthesize automático en Objective-c? (5)

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

Tal vez cuando se utiliza LLVM 3.0 y arriba? Al leer alrededor de la red, parece que @synthesize es innecesario a partir de Xcode 4. Sin embargo, estoy usando Xcode 4 y recibo advertencias cuando no lo hago @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 en algunas circunstancias.

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


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

Antes de Xcode 4.4, debe hacer una de las siguientes cosas para cada propiedad o 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 permitir que el compilador sintetice automáticamente los accesores de propiedades y la variable de instancia.

  1. Utilice la directiva @synthesize .
  2. Use la directiva @dynamic y, de alguna manera, proporcione el captador de propiedades y (si es necesario) el establecedor en tiempo de ejecución.
  3. Escriba explícitamente el método de readwrite propiedades y, si la propiedad es readwrite , el método de establecimiento de propiedades.

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


A partir de la versión 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 de forma predeterminada. Es esencialmente como se describe en la publicación del 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 propios desarrolladores de Clang han ido y vienen con la pregunta).

Que yo sepa, el único caso en el que las propiedades no se sintetizarán de forma predeterminada en el Clang 3.2 es cuando esas propiedades se han heredado de un protocolo. Aquí hay 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 compilas este ejemplo, obtendrás 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


Además, la síntesis no será automática si ha implementado el configurador Y el captador manualmente. Entonces, si se pregunta por qué no puede acceder a _someVariable, después de haber declarado @property (...) SomeType someVariable, es porque ha implementado setSomeVariable: y algunos métodos Variables.


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

Objective-C @properties se sintetizan de forma predeterminada cuando no se implementan explícitamente.

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


Puede desactivar las advertencias de sintetización haciendo clic en el nombre del proyecto en el Project Navigator a la izquierda, luego haga clic en Todo en Cobined en Configuración de compilación y luego busque sintetizar. Eso se debe establecer en No.