2010-11-12 58 views
2

J'ai une instance de AVPlayer dans mon application. Utiliser la fonction d'observation de limite de temps:Fuite dans [AVPlayer addBoundaryTimeObserverForTimes]

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

Le problème est que, selon les instruments que je suis des tableaux et une fuite quelque part autour de valeurs de ce code. J'ai vérifié le compte de retenue du jeton d'observation du temps retourné par AVPlayer sur les endroits marqués A et B dans l'exemple de code. Au point A, le nombre de rétention est 2, au point B, le nombre de rétention augmente à 3 (!). L'ajout d'un pool autorelease local ne change rien. Je sais que le nombre de retenue n'est pas une mesure fiable, mais cela semble être louche. Des idées sur pourquoi le nombre de retenue augmente ou sur mes fuites? La trace de la pile au point de fuite ressemble à ceci:

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 je comprends bien les choses, AVPlayerOccasionalCaller est l'objet « opaque » retourné par addBoundaryTimeObserverForTimes:queue:usingBlock:, ou l'observateur de temps.

+0

Avez-vous trouvé une solution? Je fuis un objet __NSArrayI et CMTimeAsValue lorsque j'utilise cet observateur. – Bastian

+0

Non, je suis passé à un truc de lecture vidéo différent pour me débarrasser de la limite temporelle en regardant tout le temps. – zoul

+0

merci pour votre réponse :) – Bastian

Répondre

2

N'utilisez pas -retainCount.

Le nombre absolu de rétention d'un objet n'a pas de sens.

Vous devez appeler release exactement le même nombre de fois que vous avez provoqué la conservation de l'objet. Pas moins (sauf si vous aimez les fuites) et, certainement, pas plus (sauf si vous aimez les accidents). Pour plus de détails, voir le Memory Management Guidelines.


Dans ce cas spécifique, le nombre de réceptions que vous imprimez est totalement hors de propos. removeTimeObserver: est probablement en train de conserver et de libérer automatiquement l'objet. Ça n'a pas vraiment d'importance; c'est un détail d'implémentation.

Lorsque vous utilisez les Fuites de modèle Instrument, notez que les allocations instrument est configuré pour enregistrer les compteurs de référence. Lorsque vous avez détecté une "fuite", regardez la liste des événements de comptage de référence pour cet objet. Il y aura probablement une pile où votre code déclenche une retenue supplémentaire. Sinon, il pourrait s'agir d'un bug d'infrastructure.