2011-12-21 5 views
9

Tengo un proyecto que contiene algunos archivos que usan ARC y otros no. Los que no tienen el indicador del compilador que deshabilita ARC. Eso funciona bienObteniendo "Se esperaba un atributo de propiedad antes de 'fuerte'" al compilar un archivo ARC con LLVM-GCC

También quiero asegurarme de que mi biblioteca se compila para LLVM-GCC y también para el compilador LLVM.

que tienen una propiedad como esta:

@property (strong, nonatomic) NSString *foo; 

Sin embargo, cuando compilo en LLVM-CCG, me sale:

"Se esperaba un atributo de propiedad antes de 'fuerte'"

Si Cambio fuerte para retener, compila bien. Strong también funciona bien en el compilador LLVM.

¿Qué me estoy perdiendo? ¿No es fuerte sinónimo de retener?

Respuesta

12

Está utilizando un compilador obsoleto y espera que admita nuevas funciones de idioma. Eso simplemente no va a suceder. Si usa palabras clave introducidas con ARC, debe usar Clang.

+0

Ah, como una nota adicional, enviaré bibliotecas estáticas. Creo que todo debería estar bien, porque estoy compilando usando Clang. Todo lo que tendré que hacer es asegurarme de que uso retener en mis archivos de encabezado. ¿Pensamientos? – jimothy

+1

@jimothy: a menos que tenga una muy buena razón para apoyar a GCC, diría que solo debe requerir Clang. –

7

Como Kevin indica, si está utilizando ARC en cualquier punto de su proyecto de biblioteca estática, solo será compatible con el compilador LLVM 3.0 y posteriores.

Sin embargo, si desea crear un marco que utiliza el recuento de referencias manual, pero que se puede utilizar en proyectos ARC habilitados y es compatible con compiladores anteriores, es posible que deba configurar algunas definiciones del compilador. Tuvimos que hacer esto para el marco del Diagrama central a fin de que los encabezados para ese marco sean compatibles en todos los proyectos ARC y no ARC generados utilizando una variedad de compiladores y objetivos.

Para ello, me sacó de Ryan Petrich de ZWRCompatibility, que describe en su respuesta here, y ensamblaron A continuación se definen:

#if TARGET_OS_IPHONE && defined(__IPHONE_5_0) && (__IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_5_0) && __clang__ && (__clang_major__ >= 3) 
#define CPT_SDK_SUPPORTS_WEAK 1 
#elif TARGET_OS_MAC && defined(__MAC_10_7) && (MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_7) && __clang__ && (__clang_major__ >= 3) 
#define CPT_SDK_SUPPORTS_WEAK 1 
#else 
#define CPT_SDK_SUPPORTS_WEAK 0 
#endif 

#if CPT_SDK_SUPPORTS_WEAK 
#define __cpt_weak  __weak 
#define cpt_weak_property weak 
#else 
#if __clang__ && (__clang_major__ >= 3) 
#define __cpt_weak __unsafe_unretained 
#else 
#define __cpt_weak 
#endif 
#define cpt_weak_property assign 
#endif 

Esto permite referirse a variables que no son retenidas (asignados) de instancia como lo siguiente:

__cpt_weak CPTAnnotationHostLayer *annotationHostLayer; 

con la definición de la propiedad coincidente

@property (nonatomic, readwrite, cpt_weak_property) __cpt_weak CPTAnnotationHostLayer *annotationHostLayer; 

Para los destinos de iOS 5.0 y Lion utilizando el compilador LLVM 3.0, esto hace que estas propiedades utilicen el calificador __weak más seguro. Para iOS 4.0 y Snow Leopard bajo LLVM Compiler 3.0, esto se convierte en __unsafe_unretained. Finalmente, para cualquier otro compilador, el calificador está en blanco y la propiedad se establece en assign.

retain puede usarse para propiedades sin mucho problema en todos los compiladores.

+0

El ejemplo de Apple en Availability.h usa las constantes en lugar de comprobar que la macro está disponible, por lo que 'MAC_OS_X_VERSION_MIN_REQUIRED> = 1070' en lugar de' defined (__ MAC_10_7) && (MAC_OS_X_VERSION_MIN_REQUIRED> = __MAC_10_7) '. –

0

Está utilizando el compilador incorrecto. LLVM GCC no admite Strong ni otras palabras clave de ARC. Configure su compilador como compilador de LLVM 4.2

Cuestiones relacionadas