Mejores prácticas de iOS 5 (¿liberar / conservar?)


109

Como programador principiante de iPhone, ¿cuál es la mejor práctica para escribir aplicaciones que se usarán con iOS 5 o versiones anteriores? Específicamente, ¿debo continuar usando la liberación / retención de datos, o debo ignorar eso? ¿Importa?


1
Utilice ARC y siga las mejores prácticas que se describen aquí: amattn.com/2011/12/07/arc_best_practices.html Si hace eso, encontrará que ARC "simplemente funciona". Si no sigue esas prácticas, terminará con filtraciones y dedicará mucho tiempo a rastrearlas ....
n13

Respuestas:


98

Tu decides. Puede escribir aplicaciones usando ARC (Recuento automático de referencias), y Xcode escribirá "código de pegamento" para permitir que sus aplicaciones habilitadas para ARC se ejecuten en iOS 4, sin necesidad de modificaciones. Sin embargo, ciertas cosas no funcionarán, y lo más notable es que muchas bibliotecas que podría desear usar arrojarán (a veces) innumerables errores y no podrá usarlas hasta que los desarrolladores publiquen una actualización que sea compatible con ARC.


Editar : Recientemente descubrí que puede desactivar ARC por archivo. Vea la respuesta de pixelfreak . Por lo tanto, mi consejo sigue en pie, pero ahora las bibliotecas de terceros no deberían tener que actualizarse para funcionar con ARC.

Esto es lo que dice Apple sobre la exclusión voluntaria de ARC para archivos específicos:

Cuando migra un proyecto para usar ARC, la marca del compilador -fobjc-arc se establece como predeterminada para todos los archivos fuente de Objective-C. Puede deshabilitar ARC para una clase específica usando la marca del compilador -fno-objc-arc para esa clase. En Xcode, en la pestaña Fases de compilación de destino, abra el grupo Compilar fuentes para revelar la lista de archivos fuente. Haga doble clic en el archivo para el que desea establecer la bandera, ingrese -fno-objc-arc en el panel emergente, luego haga clic en Listo.

ingrese la descripción de la imagen aquí

Consulte la guía de transición completa aquí .


15
ARC evidentemente se puede desactivar "por archivo", quizás permitiendo el uso de bibliotecas heredadas ... Pero no he jugado con él, así que aún no lo sé. Sin embargo, estoy bastante emocionado por eso. ¿Te imaginas un mundo donde los desarrolladores de iOS no tengan que preocuparse por retener / liberar? ¿De qué hablaremos aquí en SO? ;-)
Dan Ray

45
Justo cuando finalmente pude manejar bien toda esa basura de administración de memoria, y luego la vuelven irrelevante. ¡¡¡TRABAJOS!!!
Kongress

@Dan: ¿No estás bromeando sobre que se puede apagar selectivamente? Por favor, dé un enlace, ¡eso es importante para mí! : D
sudo rm -rf

1
Creo que el compilador no está bajo NDA ahora, así que para excluir selectivamente algunos archivos (generalmente carpetas de origen de terceros) de su código, simplemente agregue esto como opción de compilador a cada archivo: -fno-objc-arc
blackjack75

2
@Yar: Sí, lo eres. Desearía que fuera así de simple, pero desafortunadamente no todas las bibliotecas son tan simples. Tomemos JSONKit, por ejemplo. Intente ejecutar eso a través de la verificación ARC. Verás lo que quiero decir. ;)
sudo rm -rf

170

Para cualquiera que todavía tenga curiosidad sobre cómo desactivar ARC en archivos individuales, esto es lo que hice:

  1. Vaya a la configuración de su proyecto, en Build Phases > Compile Sources
  2. Seleccione los archivos que desea que ARC deshabilite y agregue los indicadores del compilador -fno-objc-arc . Puede establecer banderas para varios archivos de una sola vez seleccionando los archivos y luego presionando la tecla "Enter".

No sé si esta es la forma recomendada, pero me funciona.

PD: Recopilé esta información de clang.llvm.org aquí, que es de acceso público, por lo tanto, no bajo NDA.


1
Cuando uso esta bandera con una biblioteca, funciona, pero tan pronto como incluyo el archivo lib .h en una clase ARC, Xcode se queja como si no tuviera la bandera allí. ¿Pudiste hacer que las bibliotecas más antiguas funcionaran con esta marca?
casey

Puedo hacer que ASIHttpRequest y SBJson funcionen (recibo 1 advertencia sobre el uso de estructuras en Reachability.h). Puse la bandera en todos sus archivos de implementación.
pixelfreak

¿Todos los archivos de implementación o solo los .h? En mi sección Compilar fuentes del proyecto, solo tiene los archivos de encabezado, no los archivos de implementación. Puedo agregarlos, pero no parece tener un efecto diferente. Para su referencia, estoy tratando de hacer que funcione un analizador REST. ( github.com/mirek/NSMutableDictionary-REST.framework )
casey

1
¡Ajá! No miré lo suficientemente de cerca los errores. Son errores diferentes que sin la bandera. Solo tuve que eliminar el grupo de liberación automática del código y ¡wha-la!
casey

Cuando selecciono varios archivos y presiono enter, como se sugirió aquí, todos se eliminaron de las 'Fuentes de compilación' en las fases de compilación. Tuve que seleccionarlos individualmente. No estoy seguro de si estoy haciendo algo mal.
Gopalakrishnan Subramanian

10

iOS 5 todavía está bajo un NDA, y probablemente lo estará hasta que publiquen la versión pública. Si tiene una cuenta de desarrollador, diríjase a los foros de desarrolladores de Apple y pregunte allí.

Para versiones anteriores, debe contar las referencias y retener y publicar en consecuencia. Consulte la guía de administración de memoria .

Editar: Aquí hay una especificación pública para el recuento automático de referencias y una cita del página pública de iOS 5 :

El conteo automático de referencias (ARC) para Objective-C hace que la administración de la memoria sea el trabajo del compilador. Al habilitar ARC con el nuevo compilador LLVM de Apple, nunca más necesitará escribir retener o liberar, lo que simplifica drásticamente el proceso de desarrollo y reduce los bloqueos y las pérdidas de memoria. El compilador tiene una comprensión completa de sus objetos y libera cada objeto en el instante en que ya no se usa, por lo que las aplicaciones se ejecutan tan rápido como siempre, con un rendimiento predecible y fluido.


¿Las aplicaciones desarrolladas con iOS 5 funcionarán con iPhones más antiguos?
Geekgirl

Podrá utilizar las herramientas para desarrollar sistemas operativos más antiguos, pero no podrá utilizar las nuevas tecnologías como ARC. Si desea apuntar a sistemas operativos más antiguos, tendrá que realizar una administración de memoria manual. Si desea utilizar ARC, tendrá que restringir a los usuarios a iOS 5.
nevan king

1
Una referencia a ARC está en una página pública de Apple developer.apple.com/technologies/ios5, por lo que al menos algunas partes no están bajo NDA.
cobbal

8
De hecho, eso no es del todo cierto. Puede compilar para iOS 4 con ARC. Cita del ingeniero de Apple: " Para iOS 4 y Mac OS 10.6, el compilador agrega un poco de código de pegamento de compatibilidad en tiempo de ejecución a su aplicación. Esto funciona para todo, excepto __variables débiles, que requieren más soporte que el que puede proporcionar el código de compatibilidad. ARC en iOS 4 es más simple que el código que no es ARC, pero no es tan simple como ARC en iOS 5. "Por cierto, la aplicación de programación WWDC se escribió con ARC y funcionó perfectamente en iOS 4.
sudo rm -rf

3
Sí; sin embargo, eso fue calificado en la charla ARC ya que solo los objetivos 4.3.x obtienen el 'pegamento de compatibilidad'.
Alan Zeino

4

Los detalles son livianos / bajo NDA por el momento, pero Apple ha implementado el Conteo de referencia automático (ARC) en iOS 5, como se detalla aquí: http://developer.apple.com/technologies/ios5/

Si desarrolla una nueva aplicación en Xcode 4 con el SDK de iOS 5, puede ignorar con seguridad el conteo de retenciones / liberaciones.

[editar] sudo rm -rf tiene un buen punto; las bibliotecas de terceros pueden verse significativamente afectadas


¿Las aplicaciones desarrolladas con iOS 5 funcionarán con iPhones más antiguos?
Geekgirl

Funcionará en iPhones con iOS 5, por lo que solo el iPhone 3GS o el iPhone 4. No creo que sea compatible con iOS 4, pero, de nuevo, LLVM lo hace al compilar, por lo que es posible producir un binario para iOS 4 y 5. Recomiendo encarecidamente obtener una cuenta de desarrollador de iOS y jugar con las opciones disponibles.
Domingo

Como señala sudo en su comentario sobre la respuesta de nevan, de hecho puede apuntar a iOS 4.0 con ARC, por lo que los dispositivos más antiguos que pueden ejecutar ese sistema operativo son compatibles con esto.
Brad Larson

3

Nadie mencionó SystemConfiguration.framework ? No olvide ponerlo en Frameworks . Pasé varias horas miserablemente para darme cuenta.


deberías explicar por qué.
John Riselvato

3

Sin duda, es la elección del desarrollador o del equipo. ARC (Automatic Reference Counter) ha facilitado un poco las cosas al administrar automáticamente la memoria por usted. Liberará, retendrá y desasignará cuando sea apropiado. Creo que debería adquirir experiencia administrando la memoria usted mismo, preferiblemente en una aplicación de prueba, si aún no lo ha hecho. Otra cosa a considerar es si su aplicación se basa en bibliotecas de terceros, que si no se convierten a ARC evitarán que su aplicación se compile. La elección depende obviamente de la situación actual.


0

establecer la bandera como -fno-objc-arc en la configuración del proyecto> Fases de compilación> Compilar fuentes

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.