Deshabilitar el conteo automático de referencias para algunos archivos

183

Descargué el SDK de iOS 5 y descubrí que ARC es una gran característica del nuevo compilador de Apple. Por el momento, muchos marcos de terceros no son compatibles con ARC. ¿Podría usar ARC para mi nuevo código y mantener el código de retención / liberación actual sin cambios? El convertidor ARC no funciona aquí, porque algunos marcos, como JSONKit, no se pueden convertir a ARC utilizando el convertidor.

Editar:

La respuesta es agregar -fno-objc-arca los indicadores del compilador los archivos que no desea ARC. En Xcode 4, puede hacer esto bajo su objetivo -> Fases de construcción -> Compilar fuentes.

no melive
fuente
2
Para aclarar, simplemente agréguelo al .marchivo. No es el .harchivo.
ma11hew28
Encontré esta conversación: github.com/gowalla/AFNetworking/issues/36 Quizás ayude a alguien cómo integrar JSONKit en un proyecto compatible con iOS5 ARC ;-) Pero no lo he
Este método funcionó para mi. Estaba agregando AsyncUdpSocket for UDP Multicast a mi proyecto y esos archivos [al menos la versión actual] NO son compatibles con ARC. Así que usé el método anterior para agregar el indicador del compilador al archivo AsyncUdpSocket.m y puedo hacer que el código funcione bien con mi aplicación.
Ashu Joshi
2
¡Esto funciona perfectamente! Datos específicos: vaya a su objetivo y elija Fases de compilación, luego compile fuentes. Si hace doble clic en el archivo .m en cuestión, aparecerá un cuadro donde puede escribir / pegar: "-fno-objc-arc"
mpemburn

Respuestas:

73

Los documentos públicos de ARC , aunque no son claros en este punto, parecen sugerir que, siempre y cuando cada clase sea ARC o se administre manualmente, las clases se pueden integrar en un solo programa.

No puede mezclar ARC y no ARC en una sola clase; el documento dice que el envío retain, release, autorelease, o retainCountmensajes de cualquier medio (incluyendo temporizadores y lleva a cabo con retraso, que el uso @selector) está prohibido en arco del código. Por lo tanto, no puede hacer ARC en una clase ARC (porque los mensajes necesarios están prohibidos) y no puede hacer ARC en una clase que no sea ARC (porque ARC agrega elementos de sintaxis que no son válidos sin ARC).

El mismo documento es un poco más claro sobre si puede integrar bibliotecas / frameworks que no sean ARC en un programa ARC: Sí. No menciona si puede usar bibliotecas / marcos ARC en un programa donde todo su código no es ARC, pero dado todo lo anterior, la implicación parece ser sí.

Peter Hosey
fuente
¡Gracias! He descubierto cómo deshabilitar ARC para las clases existentes que no son ARC.
melive
¿Podrías compartir con nosotros lo que estás haciendo?
David H
1
@David H: Si pretendía dirigir eso al interlocutor, debe tener en cuenta que el interlocutor editó su solución en la pregunta.
Peter Hosey
La compilación ARC no se puede deshabilitar en los archivos HEADER. Clang NO compilará la interfaz / encabezado basándose en la compilación de su archivo de implementación / método. Por lo tanto, los archivos de encabezado deben ser compatibles con ARC y no ARC en una compilación mixta. Veo esto como un error en el compilador.
carmin
1
@carmin: no lo es. El compilador no mira los archivos de encabezado, excepto cuando se lo indica, lo que normalmente solo hace #importdesde archivos de módulo. La configuración de los indicadores del compilador es para cada archivo de módulo (más precisamente, cada archivo en la fase de compilación "Compilar orígenes"). El compilador no tiene forma de saber si debe usar ARC o no para cualquier otro archivo, excepto heredando la opción que se le dio para el archivo de módulo con el que comenzó.
Peter Hosey
78

No es muy intuitivo cómo deshabilitar ARC en archivos MÚLTIPLES , por un tiempo lo hice uno por uno hasta que descubrí cómo hacerlo.

  1. Seleccione los archivos deseados en Target / Build Fases / Compile Sources en Xcode (CMD + clic o Shift + clic)
  2. PRESIONE ENTER (doble clic restablecerá la selección, por lo que no funciona)
  3. Escriba -fno-objc-arc
  4. Presione Entrar o Listo
Tibidabo
fuente
1
Realmente no es una respuesta a la pregunta que se hace aquí, ¡pero un buen consejo de todos modos! Votado +1
Kristof Van Landschoot
Tienes razón, no lo es, pero siempre busqué en Google el cambio y esta respuesta es uno de los mejores éxitos. Pensé en estos días la mayoría de la gente ya sabe la respuesta, pero no esta "punta"
Tibidabo
35

Si desea deshabilitar el recuento automático de referencias para algunos archivos, entonces es muy simple de hacer, simplemente siga los pasos. Agregue indicadores de compilación en Objetivos -> Fases de compilación -> Compilar orígenes.

xcode

La bandera utilizada es -fno-objc-arc y presiona enter después de escribirla. Debe hacer doble clic en la columna derecha de la fila debajo de Banderas del compilador. Espero que ayude Gracias :)

Nikhil Bansal
fuente
14
Puede usar el mismo método para habilitar ARC en un archivo específico en un proyecto que no sea ARC utilizando el indicador-fobjc-arc .
lnafziger
La compilación ARC no se puede deshabilitar en los archivos HEADER. Clang NO compilará la interfaz / encabezado basándose en la compilación de su archivo de implementación / método. Por lo tanto, los archivos de encabezado deben ser compatibles con ARC y no ARC en una compilación mixta. Veo esto como un error en el compilador.
carmin