Algunas preguntas sobre conteo automático de referencias en iOS5 SDK
134
Actualmente estoy desarrollando una aplicación para iPad. El desarrollo comenzó para iOS 4.2 y ahora continúa (y creo que se completará) para iOS 4.3. Acabo de leer sobre ARC en iOS 5, y básicamente entendí que nunca más tendremos que liberar y retener objetos. Mis preguntas son:
Si decido actualizar a iOS 5, ¿debo eliminar todo [myObject retain]y las [myObject release]declaraciones de mi código?
Si desarrollo una nueva aplicación para iOS 5 usando ARC, ¿tendré que implementar algún tipo de verificación de "retrocompatibilidad"? es decir: ¿tendré que verificar la versión de iOS y llamar a retener y liberar en consecuencia? Entonces, básicamente, ¿ARC está disponible para todas las versiones de iOS o solo para iOS 5?
Si decido actualizar a iOS 5, ¿necesito eliminar todas las declaraciones [myObject retener] y [myObject release] de mi código?
Sí, pero XCode 4.2 incluye una nueva herramienta "Migrar a Objective-C ARC" (en el menú Editar-> Refactorizar), que lo hace por usted. Llamar a Dealloc es una historia diferente. Como se menciona en los comentarios, la referencia de clang indica que debe mantener su método dealloc:
Justificación: a pesar de que ARC destruye las variables de instancia automáticamente, todavía hay razones legítimas para escribir un método dealloc, como liberar recursos no retenibles. No llamar a [super dealloc] en este método es casi siempre un error.
Habilita ARC utilizando un nuevo indicador del compilador -fobjc-arc. ARC es compatible con Xcode 4.2 para Mac OS X v10.6 y v10.7 (aplicaciones de 64 bits) y para iOS 4 e iOS 5. (Las referencias débiles no son compatibles con Mac OS X v10.6 e iOS 4). No hay soporte ARC en Xcode 4.1.
-
Si desarrollo una nueva aplicación para iOS 5 usando ARC, ¿tendré que implementar algún tipo de verificación de "retrocompatibilidad"? Es decir: ¿tendré que verificar la versión de iOS y llamar a retener y liberar en consecuencia? Entonces, básicamente, ¿ARC está disponible para todas las versiones de iOS o solo para iOS 5?
No, porque ARC hace su magia en tiempo de compilación y no en tiempo de ejecución.
En lugar de tener que recordar cuándo usar retención, liberación y liberación automática, ARC evalúa los requisitos de vida útil de sus objetos e inserta automáticamente las llamadas de método apropiadas para usted en el momento de la compilación. El compilador también genera métodos dealloc apropiados para usted.
Esto no es 100% correcto. Hay un conmutador de compilador que determina si ARC está habilitado o no. También creo que ARC necesita un poco de soporte de tiempo de ejecución, por lo que si desea que su aplicación funcione en iOS 4.x deberá dejar sus retenciones y versiones y asegurarse de que ARC esté apagado.
JeremyP
8
@JeremyP: iOS 4.0 de hecho es compatible como un objetivo para aplicaciones ARC, por lo que no es necesario mantener el código contado de referencia manual para abordar esa plataforma más antigua. iPhone OS 3.x quizás, pero imagino que Apple podría descontinuar el soporte para eso como plataforma objetivo una vez que se envíe 5.0, como sucedió con 2.x cuando salió 4.0.
Brad Larson
55
@Brad La base de instalación para iOS4 ya es más del 95%. Creo que es seguro dejar caer el soporte para iOS3 de todas formas
Henrik P. Hessel
2
No eliminas dealloc, simplemente eliminas todos tus releasecorreos [super dealloc]electrónicos. Y en el 99.9% deallocsolo libera objetos, por lo que lo elimina. Pero los objetos todavía tienen que realizar otras tareas de limpieza que no son release(cerrar archivos, eliminar observadores, etc.).
Stanislav Yaglo
8
Q1: NO, si tiene un código existente, puede seguir usándolo tal como está con el -fno-objc-arc , puede deshabilitar selectivamente ARC en cualquier archivo.
Si desea deshabilitar ARC en MÚLTIPLES archivos:
Seleccione los archivos deseados en Target / Build Fases / Compile Sources en Xcode
PRESIONE ENTER . (doble clic selecciona solo un archivo)
Escriba -fno-objc-arc
Presione Entrar o Listo
P2: NO, el objetivo puede ser tan bajo como iOS 4.0
Por lo que yo entiendo y hasta donde mi iPhone / iPod con iOS 5 y iOS 4.3 funcionan respectivamente, todo es bastante automático. Una aplicación que comencé para 4.0 y que he "actualizado" para que funcione con Xcode para iOS 5.0 nunca arroja ningún tipo de advertencia sobre mi liberación y retención, a pesar de que está en todas las ofertas, etc. Sin embargo, inserté parte del mismo código (copió el archivo) en un nuevo proyecto creado con Xcode para iOS 5 tiene muchas advertencias. Por lo tanto, parece que no tiene que eliminar todas esas llamadas, y no, de alguna manera lo adapta automáticamente para versiones anteriores. Al perfilar mi iPod, no veo fugas de memoria u otros signos de fallas en los acuerdos / descargas. ¿Esto ayuda?
La última versión beta en realidad me pide que elimine todas las llamadas de asignación, y eso es todo. Todavía puede retener / liberar pero el sistema tiene la última palabra.
Dylan Gattey
5
Sobre esta parte de tu pregunta
Si desarrollo una nueva aplicación para iOS 5 usando ARC, ¿tendré que implementar algún tipo de verificación de "retrocompatibilidad"? Es decir: ¿tendré que verificar la versión de iOS y llamar a retener y liberar en consecuencia? Entonces, básicamente, ¿ARC está disponible para todas las versiones de iOS o solo para iOS 5?
Cabe señalar que el compilador de iOS 5 toma la "retrocompatibilidad" (en realidad AGREGA el código para hacer que la retención / liberación funcione, esencialmente), pero si no está compilando para iOS 5.0, no puede usarlo weakcomo palabra clave . En su lugar lo usas assign. Esto es lamentable: weakes una gran ventaja (¡sin punteros colgantes, nunca!). Ver mi pregunta aquí para una discusión de weak, assigny ARC.
Si puede deshabilitar ARC al no usar el nuevo indicador del compilador -fobjc-arc, entonces no está obligado a volver a escribir el código en el futuro, supongo (?)
dealloc
, simplemente eliminas todos tusrelease
correos[super dealloc]
electrónicos. Y en el 99.9%dealloc
solo libera objetos, por lo que lo elimina. Pero los objetos todavía tienen que realizar otras tareas de limpieza que no sonrelease
(cerrar archivos, eliminar observadores, etc.).Q1: NO, si tiene un código existente, puede seguir usándolo tal como está con el -fno-objc-arc , puede deshabilitar selectivamente ARC en cualquier archivo.
Si desea deshabilitar ARC en MÚLTIPLES archivos:
P2: NO, el objetivo puede ser tan bajo como iOS 4.0
fuente
Por lo que yo entiendo y hasta donde mi iPhone / iPod con iOS 5 y iOS 4.3 funcionan respectivamente, todo es bastante automático. Una aplicación que comencé para 4.0 y que he "actualizado" para que funcione con Xcode para iOS 5.0 nunca arroja ningún tipo de advertencia sobre mi liberación y retención, a pesar de que está en todas las ofertas, etc. Sin embargo, inserté parte del mismo código (copió el archivo) en un nuevo proyecto creado con Xcode para iOS 5 tiene muchas advertencias. Por lo tanto, parece que no tiene que eliminar todas esas llamadas, y no, de alguna manera lo adapta automáticamente para versiones anteriores. Al perfilar mi iPod, no veo fugas de memoria u otros signos de fallas en los acuerdos / descargas. ¿Esto ayuda?
fuente
Sobre esta parte de tu pregunta
Cabe señalar que el compilador de iOS 5 toma la "retrocompatibilidad" (en realidad AGREGA el código para hacer que la retención / liberación funcione, esencialmente), pero si no está compilando para iOS 5.0, no puede usarlo
weak
como palabra clave . En su lugar lo usasassign
. Esto es lamentable:weak
es una gran ventaja (¡sin punteros colgantes, nunca!). Ver mi pregunta aquí para una discusión deweak
,assign
y ARC.fuente
Si puede deshabilitar ARC al no usar el nuevo indicador del compilador -fobjc-arc, entonces no está obligado a volver a escribir el código en el futuro, supongo (?)
fuente