He utilizado para comprobar que algunos de mis variables tenido la espera retener a contar usando [myVar retainCount] en el depurador, especialmente para var que no tienen la costumbre de dealloc.

¿Cómo hacer esto en la modalidad de ARCO? ¿Cómo asegurarse de que no hay fugas de memoria?

Nota: entiendo que el ARCO debe manejar esto para mí, pero la vida está lejos de ser perfecta, y en la vida real que tienen los objetos que a veces son asignados por las bibliotecas de terceros (mediante retener?) y nunca desasignado.

Imagen que yo hago esto:

MyObj *myObj=[[MyObj alloc] init];

entonces yo llamo

[somethingElse doSomethingWithMyObj:myObj];

y más tarde, tengo que hacer

myObj=NULL;

Si mi programa está funcionando bien, mi expectativa es que myObj está siendo destruido, pero no parece ser el caso…

Entonces, ¿cómo puedo hacer el seguimiento de este, especialmente si otracosa que no esté gestionada por mí?

Ahora, acerca de las herramientas: parece extremadamente difícil de ejecutar las herramientas de la memoria en mi mac (con 5 Megas) sin necesidad de reiniciar el mac y empezar desde cero. Esto es realmente molesto! Instrumentos de mantener estrellarse incluso antes de que el programa ha iniciado, por lo que hay un alterante solución?

  • El perfil de su aplicación a través de los Instrumentos.
  • El retener a cuenta de un objeto es carente de sentido y, ciertamente, carece de sentido en este contexto.
  • Es su doSomethingWithMyObj: método de hacer cualquier cosa para conseguir una fuerte referencia a su objeto?
  • pre-ARCO se podría anular «retener» a ver quién era la conservación de su objeto. Hay alguna forma de hacer que en nuestro nuevo ARCO mundo?
  • El Mac tiene 5 Megas? Cuidado de explicar?
  • lo siento cometer errores al escribir @AlexZavatone, fue de 4 megas de curso
  • Como el asistente bbum indica a continuación, tratando de código alrededor de retener a contar es una mezcla de aceite de serpiente y la ilusión. No se moleste.

InformationsquelleAutor tomsoft | 2012-01-14

7 Comentarios

  1. 99

    Puede utilizar CFGetRetainCount con Objective-C, objetos, incluso bajo el ARCO:

    NSLog(@"Retain count is %ld", CFGetRetainCount((__bridge CFTypeRef)myObject));

    Este es no particularmente útil para la depuración, sin embargo, por razones ampliamente descrito en otro lugar. Si usted necesita entender cuando un objeto está siendo retenidos y liberados, echa un vistazo esta respuesta para ayudar el uso de las Asignaciones instrumento.

    El único caso que he encontrado donde retener el examen de la cuenta es realmente útil es en un dealloc método, cuando algo se conserva y autoreleases el objeto que se va a cancelar. Esto va a provocar un bloqueo más tarde, cuando el grupo de liberación automática de la piscina es drenado. Usted puede localizar la causa de esta marcando el retener a contar antes y después de cada mensaje. De esta manera descubrí que el observationInfo método (que en sí es generalmente sólo es útil para la depuración) conserva y autoreleases self. Sin embargo, incluso este tipo de problema generalmente puede ser resuelto sin examinar el retener a contar, simplemente envolviendo todo el cuerpo de dealloc en un @autoreleasepool bloque.

    Sin embargo, el retener a contar puede ser usada para aprender acerca de la aplicación de algunas clases. (Esto sólo para el entretenimiento o curiosidad! Nunca confíes en la indocumentados detalles de la implementación en el código de producción!)

    Por ejemplo, tratar de inmediato en el interior de la @autoreleasepool en main:

    NSNumber *n0 = [[NSNumber alloc] initWithInt:0];
    NSLog(@"0 reference count = %ld", CFGetRetainCount((__bridge CFTypeRef)n0));
    //Prints 2 in my test

    Así NSNumber probable cachés (o, al menos, reutiliza) algunos casos. Pero no otros:

    n0 = [[NSNumber alloc] initWithInt:200];
    NSLog(@"n0 reference count = %ld", CFGetRetainCount((__bridge CFTypeRef) n0));
    //Prints 1 - I am the sole owner of this instance.  There could be weak
    //or unretained references to it, but no other strong references.
    
    NSNumber *n1 = [[NSNumber alloc] initWithInt:200];
    NSLog(@"n1 reference count = %ld", CFGetRetainCount((__bridge CFTypeRef) n1));
    //Prints 1 again.  New instance with same value as prior instance.
    //You could of course compare pointers to see that they are separate
    //instances.

    Usted puede incluso descubrir que NSNumber devuelve un singleton si alloc pero no inicializar:

    n1 = [NSNumber alloc];
    NSLog(@"n1 reference count = %ld", CFGetRetainCount((__bridge CFTypeRef) n1));
    //Prints -1.

    (Tenga en cuenta que usted también puede aprender muchos detalles acerca de NSNumber mirando el Núcleo de la Fundación código fuente, el cual está disponible en http://opensource.apple.com. Pero quién sabe lo que puedes encontrar si usted mira el conservar el número de objetos que no están libres de peaje de puente con los objetos principales de la Fundación?)

    • Esto es bueno para propósitos de depuración.
    • No, no, no. Es aún más engañoso bajo el ARCO de lo que sería de otra manera (ya que el compilador va a mover retener/release/grupo de liberación automática de llamadas a través de la optimización de los niveles, comunicados de prensa y, potencialmente, la depuración o no).
    • Wow. Que es un infierno de una edición! +1! Detalle divertido; su NSNumber ejemplo con un valor de 200 va a cambiar comportamientos en diferentes plataformas y diferentes OS libera, porque de los detalles de implementación (etiquetado de los punteros, por ejemplo), más que subyacen a cómo impredecible retainCount puede ser.
  2. 41

    No. ARCO se encarga de la gestión de la memoria para usted y no le permiten llamar a retainCount e incluso si usted puede ver, el número de devoluciones es de sentido para usted. Si usted desea que usted debe hacer de creación de perfiles de memoria en Instrumentos con las Filtraciones y las Asignaciones de los instrumentos. Que es la mejor manera de mirar y ver cómo su aplicación es la asignación de la memoria y la captura de cualquier uso indebido de memoria no.

    • ¿Qué sucede si los Instrumentos de mantener estrellarse?
    • Entonces usted necesita para mirar y ver por qué Instrumentos se bloquea, nose si su seguimiento de manera demasiado a la vez, o tal vez usted necesita para volver a instalar el dev tools. Si los Instrumentos siempre se bloquea todo el tiempo suena como algo que yo podría hacer otra pregunta para o (quizá el mejor) tomar a los foros de Desarrolladores Apple.
    • no funciona en xcode 7
  3. 15

    El uso de Instrumentos y busque el objeto que desea para seguir buscando el nombre de la clase o de la dirección de puntero, si usted la tiene, mientras que en la «Lista de Objetos».

    Cuando la encuentre, golpeó la flecha desplegable que aparece en la instancia. Esto le lleva a una historia de la vista para conserva y relases.

    Si expande el lado derecho de la vista de detalle también ver la pila de llamadas para cada retener/liberación.

    ¿Cómo puedo verificar el recuento de referencia en la modalidad de ARCO?

    • Esto es muy útil. Stackoverflow y otros lugares tienen muy buenos documentación sobre cómo utilizar los Instrumentos para la depuración de conservar los ciclos. Esta captura de pantalla y una descripción breve me ayudó a descubrirlo
    • Tenía problemas con este hasta que he encontrado esta respuesta: stackoverflow.com/questions/29121260/…
    • ¿por qué el downvote? que no parece estar directamente relacionada con la respuesta, sino más bien es un tema genérico de cómo Xcode cargas de los símbolos
    • Yo no downvote como lo que puedo decir. La respuesta que hace referencia indica que la 8.2 y 8.3 no carga el símbolo de información correctamente. Tuve problemas con esta respuesta hasta que lo probé en un 8,1 simulador. Ese comentario está destinado a proporcionar pan rallado para futuros lectores que se ejecute en el mismo problema.
    • mi mal, yo estúpidamente supone el último comentario fue un d/v al hacer clic en la notificación 🙂 gracias por agregar valor al post!!!
  4. 3

    Creo que la única manera es el perfil de su aplicación con las Asignaciones instrumento. Usted tendrá que hacer clic en la info del descriptor (el ‘yo’ junto a la Asignación en el panel de la izquierda) y haga clic en «Registro de Cuenta de referencias». Usted puede, a continuación, el perfil de su aplicación y hacer una búsqueda para la clase específica que usted está buscando para inspeccionar. Desde allí usted puede encontrar el retener a contar en la ampliación del panel de Detalles para cada instancia de la clase.

    Usted también puede hacer uso de Escapes (porque creo que es una variación de las Asignaciones instrumento).

    • Casi; el perfil de su aplicación a través de las asignaciones instrumento, sin necesidad de registro recuentos de referencia en todo. Si la memoria está creciendo, luego puede utilizar herramientas como heapshot análisis y/o grabación de recuentos de referencia para seguir la pista de la memoria de acreción.
    • Bueno, eso es si él está buscando para comprobar las fugas de memoria (lo cual es probablemente cierto), pero él le preguntó cómo comprobar retener a cuenta, y creo que esta es la única manera.
    • La verificación de retener a cuenta es absolutamente una cosa inútil que hacer, sin embargo. Completa pérdida de tiempo y es totalmente justo punto de que en la escritura de su respuesta.
    • No, no es una completa pérdida de tiempo. Un objeto puede tener más de una retener ciclo, y la comprobación de retener el recuento puede confirmar esto (de hecho, he tenido que pasar, y sí, la de conservar el conteo de 2 mostraron más de lo que debería). Si bien esto es probablemente muy raro, yo sospecho que es menos raro que la gente que usa bloques de…especialmente si son nuevas en esto.
    • No se puede asumir nada acerca de retener a cuenta. Los marcos pueden-y-a menudo conservan cosas detrás de su espalda y a veces en formas sorprendentes. Mirando el retainCount es una pérdida de tiempo. Si usted tiene una acumulación de la memoria, usted tiene que saber que la traza de la de retener a tener ningún sentido. El retener a contar, en y de sí mismo, es completamente inútil para fines de depuración y la retainCount método debe ser eliminado.
    • no comprobación de la retaincount que parece ser una muy «idealisitic» de la posición. Y estoy hablando de la depuración y seguimiento de las pérdidas de memoria. Yo soy el único que tiene el instrumento de herramientas inútiles a causa del exceso de accidente? Así que estaría encantado de tener a sus técnicas de depuración (sin Instrumento) para garantizar que NO se pierde memoria….
    • Yo en realidad no he tenido un problema con los Instrumentos de estrellarse, por lo que utilizar ampliamente. Si no se trata de «Instrumentos» que se estrellan, pero su aplicación de estrellarse en los Instrumentos, esto puede ser debido a una más sutil error. Instrumentos generalmente se utiliza una versión de lanzamiento, mientras que la depuración se utiliza la versión de depuración. Utilizando el analizador estático también ayuda: Producto -> Analizar. Aparte de eso, me recorren el código para encontrar la fuga…pero no tengo que confiar mucho en los instrumentos. Y yo no ver retener a cuenta, cuando tengo la sospecha de una retener ciclo, principalmente para determinar si hay más de un ciclo.

  5. 2

    Conseguir el objeto del retainCount?

    Usted sólo puede hacer que un punto de interrupción y ingrese el comando siguiente para conseguir el objeto del retainCount

    po object.retainCount
  6. 0

    No. Apple dicen que no es necesario, ya que los arcos se harán cargo para usted.

    • Entiendo, pero ¿qué pasa con los específicos de la calificador externo no arco bibliotecas, ….
    • Utiliza el compilador de la bandera -fno-objc-arco a no usar el ARCO con ellos en las bibliotecas.
    • Sé cómo compilar no ARCO lib con ARCO código, pero mi pregunta era ¿cómo asegurar que no hay pérdida de memoria en la cadena completa, y que un objeto tenga la espera retener a contar .
    • Soy bastante nuevo en obj-c, pero estoy bastante seguro de que en la WWDC Introducción de ARCO hablar dicen que diseñado ARCO, así que realmente no tener que preocuparse de conservar cuenta en absoluto. Simplemente funciona.
    • «Simplemente funciona» hasta que se refieren a self o una variable de instancia dentro de un bloque, lo que provoca la captura, lo que a menudo causando una retener ciclo. El compilador puede advertir sobre algunos de estos casos, pero no todos. (Y que no es el único problema potencial que el ARCO no puede resolver. Mal puente de los yesos son otra. El compilador todavía no puede leer su mente.) Los instrumentos de la memoria-herramientas de generación de perfiles todavía son necesarias.

Dejar respuesta

Please enter your comment!
Please enter your name here