2011-11-29 18 views
10

He intentado usar la herramienta de fugas y "analizar", etc. para encontrar la fuga, pero no puedo encontrarla. Usando asignaciones puedo determinar los objetos que no se están liberando.¿Cómo puedo determinar qué objetos contienen referencias a otros objetos que causan pérdidas de memoria en Object-C?

He notado (agregando declaraciones de depuración en el método dealloc), que dealloc no se llama para estos objetos.

¿Cómo puedo determinar qué objetos contienen referencias a estos objetos y evitar que se liberen?

+0

Los objetos no "mantienen" referencias. Por el contrario, los recuentos de referencia se incrementan por métodos. –

+0

Tienes razón. Quise decir que estaba tratando de determinar qué objetos no reducen el conteo de retención cuando terminan con los otros objetos. – xcoder

Respuesta

2

La herramienta analizar fue incapaz de detectar el problema. Usar la herramienta de asignaciones para capturar todos los recuentos de referencia fue un comienzo, pero había tantas clases que no reconocí, o acceso directo, no pude rastrear el problema usando este método. En cambio, hice una lista de las clases de las cuales yo era directamente responsable, e investigué a cada una de ellas línea por línea hasta que encontré los problemas. La causa fue que utilicé algunas bibliotecas de terceros que no disminuyeron el conteo retenido de algunos de mis objetos como se esperaba. Supongo que en este caso, seguir mejores principios de ingeniería de software/patrones de diseño y tener revisiones completas del código puede haber captado el problema antes.

+2

Sí, las mejores prácticas de codificación y la revisión exhaustiva del código son las mejores formas de detectar la mayoría de estos errores (y muchos otros). –

+0

Sí. Creo que uno debe usar el método que mencionó ANTES de recurrir a la herramienta de análisis. Es mucho más fácil verificar dos veces tu propio código para asegurarte de que el problema no esté allí antes de analizarlo. – braden

1

Comenzaré construyendo y analizando el proyecto (Comando Shift B en el IDE).

+0

Intenté esto, pero "analizar" a veces no lo encuentra. – xcoder

1

Puede sobrecargar implementaciones de retención/liberación/liberación automática en clases problemáticas (si es una clase SDK, es posible usar una categoría) y establecer un punto de interrupción allí. Su punto de interrupción será golpeado cada vez que algo retiene su objeto.

+0

Esta es una gran solución si la codificación cuidadosa y la revisión ENTONCES analizan todavía no le dan una respuesta. – braden

11

Si necesita ver donde conserva, lanzamientos y autoreleases ocurren durante los instrumentos de uso del objeto:

Ejecutar en instrumentos, en las asignaciones establecidas "recuentos de referencias de registro" en el (hay que parar la grabación para establecer la opción) Haga que el selector se ejecute, detenga la grabación, busque allí ivar (datePickerView), desglose y podrá ver dónde se produjeron todas las retenciones, lanzamientos y autorreleases.

enter image description here

+0

Buena idea. Yo lo hice. Me resultó muy difícil localizar quién se aferraba a él, ya que había demasiadas clases que no reconocía, o acceso directo. Al final acabo de hacer una lista de las clases que conozco acceden directamente a mi objeto, y las revisé una a una. – xcoder

+7

Para cualquiera que se lo pregunte, la opción "Recuento de referencias de registros" está oculta detrás de la 'i' junto a 'Asignaciones' en el panel izquierdo http://snag.gy/F39G0.jpg – yonilevy

+0

¡No se puede votar lo suficiente! Muchas gracias. –

Cuestiones relacionadas