2011-11-07 8 views
5

Estoy tratando de cumplir con las directrices de Apple sobre cómo responder a las advertencias de memoria baja en mi aplicación. Las directrices dicen: "Al recibir (una advertencia de memoria baja), la aplicación debe liberar la mayor cantidad de memoria posible liberando los objetos que no necesita o borrando los cachés de memoria que puede recrear más tarde".iOS 5 + ARC - ¿asigna cero a la memoria libre de puntero?

La pregunta es, ¿cómo 'liberar' memoria, usando ARC?

Por ejemplo, supongamos que tengo una imagen en la jerarquía de vista de una vista que no está en la pantalla. En didReceiveMemoryWarning, actualmente lo elimino de la vista llamando a removeFromSuperview, pero todavía tengo un puntero al propio UIImage. ¿Debería también intentar liberar este recuerdo? ¿Cómo? ¿Al asignar nil al puntero?

TIA: John

+0

Proporcione más información sobre el puntero. ¿Es un ivar, local en un método, global, propiedad? – zaph

+0

Bueno, los que estoy pensando son variables de instancia UIImage *. – John

+0

De acuerdo, creo que resolví mi problema 1) usando una referencia débil a la subvista y 2) asignando nil al puntero si la vista todavía estaba presente cuando se ejecutó didReceiveMemeoryWarning (que era cada vez que lo veía en el depurador) . Principalmente, creo que me acabo de dar cuenta de que no puedes evitar las advertencias de memoria todo el tiempo ... a veces son causadas por otras aplicaciones. Solo necesita manejarlos adecuadamente. Después de arreglar mi controlador de advertencia de memoria, solo recibí la advertencia una vez, en lugar de cada vez que activaba UIImagePickerController. Una gran mejora. – John

Respuesta

3
  1. Por el momento de llegar -didReceiveMemoryWarning, su punto de vista debería haber sido liberado automáticamente por el sistema y -viewDidUnload debe ser llamado. Entonces, si no tiene referencias a las subvistas de la vista, no es responsable de liberarlas.

  2. De lo contrario, si mantiene referencias a algunos recursos que desea liberar, simplemente anula sus referencias asignándoles "nil" para NSObject s, y llama a las funciones de liberación correspondientes para otros tipos de referencias, por ejemplo, CFRelease para Core Foundation objetos.

+0

H'mmm ... la cosa es que sí, hago referencia a algunas subvistas, porque la aplicación necesita poder modificar o eliminar las subvistas, como parte del funcionamiento normal de la aplicación. Es fácil poder decir [self.mySubView removeFromSuperview] cuando sea necesario, en lugar de atravesar el árbol de la subvista cada vez que necesito eliminar/modificar una subvista. Pero supongo que eso significa que el sistema no puede liberar la subvista, incluso si la vista es de lanzamiento. ¿La subvista se publicaría correctamente si tuviera un vínculo débil con ella? – John

+1

Claro, puede usar '__weak', o simplemente puede configurarlo en' nil' en '-viewDidUnload'. – an0

+0

En iOS6 viewDidUnload ya no se llama automáticamente. Necesita utilizar didReceiveMemoryWarning. – bkbeachlabs

0

Realice todas las IBOutlet propiedades con el atributo strong.

Establezca todas las propiedades IBOutlet todas a nil en viewDidUnload.

+2

@John preguntó específicamente sobre ARC. Conservar y liberar ya no se usan. – Undeadlegion

Cuestiones relacionadas