Pregunta

Tengo una instancia de AVPlayer en mi solicitud. Utilizo la función de la observación de límite de tiempo:

[self setTimeObserver:[player addBoundaryTimeObserverForTimes:watchedTimes
    queue:NULL usingBlock:^{
        NSLog(@"A: %i", [timeObserver retainCount]);
        [player removeTimeObserver:timeObserver];
        NSLog(@"B: %i", [timeObserver retainCount]);
        [self setTimeObserver:nil];
    }]];

El problema es que de acuerdo a los instrumentos estoy filtrando algunas matrices y valores en algún lugar alrededor de este código. Comprobé el recuento de retener el tiempo de observación del token devuelto por AVPlayer en lugares marcados A y B en el código de ejemplo. En el punto A, el recuento es retienen 2, en el punto B del conservan contar aumenta a 3 (!). La adición de una piscina autorelease local no cambia nada. Sé que retienen recuento no es una métrica fiable, pero esto parece ser sospechoso. Alguna idea acerca de por qué el aumento de cuenta de retención o sobre mis fugas? El seguimiento de la pila en la apariencia de fuga como esto:

   0 libSystem.B.dylib calloc
   1 libobjc.A.dylib _internal_class_createInstanceFromZone
   2 libobjc.A.dylib class_createInstance
   3 CoreFoundation __CFAllocateObject2
   4 CoreFoundation +[__NSArrayI __new::]
   5 CoreFoundation -[__NSPlaceholderArray initWithObjects:count:]
   6 CoreFoundation +[NSArray arrayWithObjects:count:]
   7 CoreFoundation -[NSArray sortedArrayWithOptions:usingComparator:]
   8 CoreFoundation -[NSArray sortedArrayUsingComparator:]
   9 AVFoundation -[AVPlayerOccasionalCaller initWithPlayer:times:queue:block:]
  10 AVFoundation -[AVPlayer addBoundaryTimeObserverForTimes:queue:usingBlock:]

Si entiendo las cosas correctamente, AVPlayerOccasionalCaller es el objeto “opaco” devuelto por addBoundaryTimeObserverForTimes:queue:usingBlock:, o el observador tiempo.

¿Fue útil?

Solución

No utilice -retainCount.

La absoluta conservan recuento de un objeto es de sentido.

Debe llamar release exactamente el mismo número de veces que usted causó el objeto a ser retenido. No menos (a menos que como fugas) y, desde luego, no más (a menos que como los accidentes).

Ver la Directrices de gestión de memoria para más detalles.


En este caso específico, la retienen cuenta que está imprimiendo es completamente irrelevante. removeTimeObserver: es, probablemente, la retención y autoreleasing el objeto. Realmente no importa; es un detalle de implementación.

Al utilizar los Las fugas plantilla en Instrumento, nota que el Asignaciones instrumento está configurado para recuentos de referencias de registro. Cuando haya detectado una "fuga", vistazo a la lista de eventos recuento de referencia para ese objeto. Es probable que haya una pila en algún código de los suyos está provocando un extra conservan. Si no es así, podría ser un error marco.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top