stb smart samsung rca ps4 optico cable arc iphone ios automatic-ref-counting

iphone - smart - ¿Cómo verifico el recuento de referencias en el modo ARC?



hdmi arc sony (7)

Solía ​​verificar que algunas de mis variables tenían el recuento de retención esperado utilizando [myVar retainCount] debajo del depurador, especialmente para var que no tenía un dealloc personalizado.

¿Cómo se hace esto en modo ARC? ¿Cómo se asegura de que no haya pérdidas de memoria?

Nota: Entiendo que ARC debe manejar esto por mí, pero la vida está lejos de ser perfecta, y en la vida real tiene objetos que a veces son asignados por bibliotecas de terceros (usando retener?) Y nunca se desasignan.

Imagen que hago esto:

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

entonces yo llamo

[somethingElse doSomethingWithMyObj:myObj];

y luego, lo hago

myObj=NULL;

Si mi programa funciona bien, mi expectativa es que myObj esté siendo destruido, pero parece que no es el caso ...

Entonces, ¿cómo puedo rastrear esto, especialmente si algo no está administrado por mí?

Ahora, sobre las herramientas: parece extremadamente difícil ejecutar herramientas de memoria en mi mac (con 5 Meg) sin reiniciar el mac y comenzar desde cero. ¡Esto es realmente molesto! Los instrumentos siguen fallando incluso antes de que el programa haya comenzado, entonces ¿hay una solución alternativa?


Creo que la única forma es perfilar su aplicación utilizando el instrumento Allocations. Deberá hacer clic en el descriptor de información (la ''i'' junto a Asignación en el panel izquierdo) y hacer clic en "Registrar recuentos de referencia". Luego puede perfilar su aplicación y hacer una búsqueda para la clase específica que desea inspeccionar. Desde allí puede encontrar el recuento de retención en el panel de detalles ampliados para cada instancia de la clase.

También puede hacer esto usando Leaks también (ya que creo que es una variación del instrumento Allocations).



Obtenga el objeto retainCount ?

Puede hacer un punto de interrupción e ingresar el siguiente comando para obtener la retainCount del objeto

po object.retainCount


Puede usar CFGetRetainCount con objetos Objective-C, incluso bajo ARC:

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

Sin embargo, esto no es particularmente útil para la depuración, por razones ampliamente descritas en otra parte . Si necesita comprender dónde se retiene y libera un objeto, consulte esta respuesta para obtener ayuda con el instrumento Allocation.

El único caso que encontré al examinar el recuento retenido es realmente útil en un método dealloc , cuando algo retiene y libera automáticamente el objeto que se desasigna. Esto causará un bloqueo más adelante cuando se vacíe el grupo de autorrelease. Puede identificar la causa de esto al verificar el recuento de retención antes y después de cada mensaje. De esta forma, descubrí que el método observationInfo (que en sí solo suele ser útil para la depuración) conserva y libera self . Sin embargo, incluso este tipo de problema generalmente se puede resolver sin examinar el conteo de retención, simplemente envolviendo todo el cuerpo de dealloc en un bloque @autoreleasepool .

Sin embargo, el recuento de retenciones se puede utilizar para conocer la implementación de algunas clases. (¡Solo haga esto para entretenimiento o curiosidad! ¡Nunca confíe en detalles de implementación no documentados en el código de producción!)

Por ejemplo, intente esto inmediatamente dentro del @autoreleasepool en main :

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

Entonces NSNumber probablemente almacena en caché (o al menos reutiliza) algunas instancias. 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.

Incluso puede descubrir que NSNumber devuelve un singleton si se alloc pero no se inicializa:

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

(Tenga en cuenta que también puede obtener muchos detalles sobre NSNumber al consultar el código fuente de Core Foundation, que está disponible en http://opensource.apple.com . Pero quién sabe qué puede encontrar si observa el recuento de objetos retenidos que no tienen un puente libre con objetos en Core Foundation?)


Tu no ARC maneja la administración de la memoria por usted y no le permite llamar a retainCount e incluso si pudiera verlo, el número que devuelve no tiene sentido para usted. Si lo desea, debería estar haciendo perfiles de memoria en Instrumentos con los instrumentos de Fugas y Asignaciones. Esa es la mejor manera de ver y observar cómo su aplicación está asignando memoria y capturar allí el uso incorrecto de la memoria.


Tu no Apple dice que no es necesario, ya que ARC lo manejará por usted.


Usa instrumentos y localiza el objeto que deseas rastrear buscando el nombre de la clase o la dirección del puntero si lo tienes mientras estás en "Lista de objetos".

Cuando lo haya localizado, presione la flecha de divulgación en la instancia. Esto lo lleva a una vista de historial para retenciones y relases.

Si expande la vista de detalles del lado derecho, también verá la pila de llamadas para cada retención / liberación.