2011-06-08 14 views
39

Al intentar utilizar -retain, -release y -dealloc mientras que la construcción de mi aplicación mediante el recuento de referencias automática en Xcode 4.2, me sale un error como el siguiente:En conteo automático de referencias, ¿por qué no se permiten retener, liberar y destrabar?

Saldo de referencias automática prohíbe enviar mensaje explícito de 'dealloc'

¿Por qué aparece este error? ¿-retain, -release y -dealloc ya no están permitidos en el recuento automático de referencias?

+0

¿Encontraste otra solución? –

Respuesta

67

Básicamente:

Cuando se usa ARC, que es todo o nada. O bien el compilador está administrando todas las retenciones/releases/deallocs por usted, o no está haciendo nada. Usted no puede intercalar sus propias llamadas a ellos, porque el compilador quiere hacerlo todo por sí mismo. Puede hacer optimizaciones absurdas al hacer esto (por ejemplo, un método que devuelve un objeto liberado automáticamente en Gestión de memoria manual ahora puede producir un objeto que nunca termina en un grupo de liberación automática). Si comenzaras a rociar tus propias llamadas para retenerlas y liberarlas, entonces el compilador tendría que trabajar con ellas y no sería capaz de realizar muchas de las optimizaciones que desea (y que deberías desear).

Y como una ventaja adicional, invocando -retainCount ahora es un error de compilación! ¡OH DIA FELIZ!

+1

¿Esto significa que no puede usar los marcos que utilizan retener o liberar en un proyecto que usa ARC? ¿No hubiera sido mejor si el compilador en cambio eliminara las llamadas de retener/liberar "manuales" del usuario, para * reemplazar * con las suyas propias, de modo que permita compilar el código anterior o las libretas externas en un proyecto ARC? – AliSoftware

+0

@AliSoftware sí, aún puede usar esos marcos. El problema con 'retain' /' release' es en tiempo de compilación, no en tiempo de ejecución. –

+4

Thx Dave para la precisión ... pero ¿qué pasa con el código externo (a veces incorrectamente llamado "frameworks/libraries" por uso incorrecto del lenguaje, pero que son mucho más "paquetes de códigos sin compilar"), como, por ejemplo, ASIHTTPRequest, Reachability.h /.m y tal? (eso fue lo que estaba pensando en realidad) – AliSoftware

1

en respuesta a AliSoftware: we CNA mezcla ARTC y frameworks no-ARC, y también fuente de arco y no-ARC.

(lo hice ..)

Las ideas básicas son: 1) compilador inserción/extracción de llamadas como una muy-muy-buen programador de cacao puede hacer 2) de cacao es el código MODOS C, por lo tenemos compilaciones separadas, por lo que el enlazador PUEDE enlazar binarios producidos por múltiples fuentes. Piénselo como podemos mezclar asm y cacao, o C y pascal ...

en la opinión principal el Appleadvantege sobre C#/java está aquí: estamos siempre permite mezclar, y, utilizando una técnica de COMPILER 8non en tiempo de ejecución. .) podemos acelerar el rendimiento más allá.

1

En el recuento automático de referencias, retener, liberar y destrabar no están permitidos.

Si tiene un código existente, puede seguir utilizándolo tal como está con -fno-objc-arc, puede desactivar selectivamente ARC en cualquier archivo.

Si desea desactivar la ARC en varios archivos:

Seleccione los archivos deseados en Target/Construir Fases/Compilar Fuentes en Xcode PRESS ENTER. (Doble clic selecciona un solo archivo) Tipo -fno-objc arco Pulse Intro o hecho

0

Como ya he señalado en mi answer en Xcode ARC, puede compilar archivos de fuentes específicas como no ARC. La respuesta de Dave DeLong está un poco desajustada. No incluye el hecho de que puede indicar al compilador que compile el origen como no ARC en un proyecto habilitado ARC (como se explica en here).

Cuestiones relacionadas