2011-10-14 21 views
28

Resumen:¿Puede agregar a mi lista de comprobación las cosas a tener en cuenta al migrar a iOS 5? StackOverflow ha sido muy valioso ya que he trabajado en la actualización a iOS 5. He descubierto algunas cosas bastante básicas que me había perdido antes de Xcode 4.2, y me pregunto qué otras "trampas" podrían estar al acecho.Lo que debe tener cuidado al pasar a iOS 5

Detalle: Con iOS 5 de envío esta semana, he tenido que hacer algunos cambios en un par de mis aplicaciones. Xcode 4.2 hace un trabajo mucho mejor al analizar el código de administración de memoria debido a la nueva característica ARC. La actualización de iOS 5 es un excelente punto para revisar todo su código de administración de memoria. El nuevo compilador también encuentra una cantidad de otros problemas que los compiladores anteriores omitieron. Felicitaciones a los ingenieros compiladores de Apple. Estas son las principales cosas que han ayudado (y muchas de ellas también se aplicarán a versiones anteriores de iOS).

  1. Asegúrate de call [super dealloc] at the END of your dealloc methods, no el comienzo.
  2. En viewDidUnload, some people have reported bugs that require [super viewDidUnload] to be called at the end, no el comienzo, de su viewDidUnload.
  3. Comprender los recuentos de retención, los setters sintetizados y cuándo llamar la liberación o la liberación automática. El nuevo compilador señalará más problemas que los compiladores anteriores. (Pensé que había sido cuidadoso, pero aparentemente no fui lo suficientemente cuidadoso.) Se requiere lectura de memory management guide de Apple, sin atajos.
  4. Es una buena idea para turn on zombies when debugging (en Xcode, elija Producto | Editar esquema ... y seleccione el esquema de depuración; en la pestaña Diagnóstico, marque Activar objetos de zombie). Esto puede ayudarlo a encontrar intentos de uso de zombies (objetos que ya no debería usar).
  5. El instrumento Leaks también es útil. Ejecute su aplicación en el modo Perfil y elija la plantilla de Fugas. En la ventana Instrumentos, seleccione el instrumento Fugas y marque la casilla que dice "Recopilar contenido de la memoria escapada" y le ayudará a ver dónde se origina la memoria filtrada en su código.

Hay algunas cosas sueltas que he encontrado:

  • singleton pattern necesidades de Apple "unidireccional" añadido a la declaración de tipo de retorno:
 
    - (oneway void) release { } 

¿Alguna otra sugerencia de peligros potenciales que debería buscar? Tengo la sensación de que mis aplicaciones son más estables ahora, pero me sentí bastante bien con ellas antes.

+1

No es gestión de memoria, pero de todos modos es importante: si descarga datos y desea almacenarlos en el dispositivo, tenga cuidado de no guardarlos en la carpeta de documentos. Use Library/Caches o tmp para eso. O almacene los datos de la aplicación en NSApplicationSupportDirectory anexado por su ID de paquete. ver http://developer.apple.com/library/mac/#documentation/FileManagement/Conceptual/FileSystemProgrammingGUide/FileSystemOverview/FileSystemOverview.html#//apple_ref/doc/uid/TP40010672-CH2-SW1 para más detalles. –

+1

Sin administración de memoria tampoco. Pero si está haciendo cosas relacionadas con Seguridad/Certificado. Tenga en cuenta que los certificados hash MD5 devuelven kSecTrustResultRecoverableTrustFailure en SecTrustEvaluate. Porque ios5 considera que los hashes MD5 no son seguros. – n3utrino

+1

Otra cosa para migrar a IOS5 es el UDID en desuso. http://stackoverflow.com/questions/6993325/uidevice-uniqueidentifier-deprecated-what-to-do-now –

Respuesta

6

1/Los controladores modales se comportan de manera diferente, si cambiaba su tamaño. Si necesita un diálogo modal de un tamaño diferente, considere usar los controles de vista hijo iOS 5.

2/Para una tabla, si devolvía nil encabezado de sección y altura positiva, en iOS 4, el encabezado estaba oculto. En iOS 5, debe devolver altura cero para encabezados nulos.

3/UDID está desaprobada. Puede usar CFUUIDCreate para crear una identificación única y guardarla en su configuración, pero tenga en cuenta que se pueden hacer copias de seguridad de los datos de un dispositivo y luego restaurarlos en otro dispositivo, dejándolo con dos dispositivos con la misma identificación.Resolví la situación guardando mi identificación en llavero con el atributo kSecAttrAccessibleWhenUnlockedThisDeviceOnly.

Acerca de su lista: [super viewDidUnload] debe llamarse siempre como la última instrucción en su viewDidUnload. La lógica es la misma que en [super dealloc]. Tenga en cuenta que también debe llamar a [viewDidUnload] en su dealloc (si todavía no ha liberado su memoria allí) porque no se llama implícitamente (aunque a veces lo es).

Según mis experimentos, la detección de fugas en los instrumentos no informa las fugas en las propiedades que se sintetizan sin asignar un nombre de propiedad.

+0

Gracias por la respuesta. ¿Podrías aclararme algo? Creo que estamos diciendo lo mismo sobre la cuestión de cuándo llamar a [super viewDidUnload]. Además, mejoraría su respuesta para ilustrar más claramente la sugerencia de las circunstancias bajo las cuales debe llamar [self viewDidUnload]. –

+3

En general, si usa ARC y sus IBOutlets son débiles, todo se descarga cuando se descarga la vista. Pero sin ARC y con IBOutlets fuertes (retener) (por ejemplo, si los está agregando y eliminándolos dinámicamente de la vista), desea liberarlos dentro de viewDidUnload. Sin embargo, desea liberarlos también en su método dealloc. Para eliminar la duplicidad del código, simplemente llame a viewDidUnload desde dealloc. Debe colocarlo allí siempre porque no se llama automáticamente cuando se libera el controlador de vista. – Sulthan

Cuestiones relacionadas