Question

J'ai une instance de AVPlayer dans ma demande. J'utilise l'observation limite de temps caractéristique:

[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é Retain compte 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 est de 2 conservent, au point B conservent le compte augmente à 3 (!). Ajout d'un pool autorelease local ne change rien. Je sais que conserver le nombre n'est pas une mesure fiable, mais cela semble être louche. Toutes les idées sur les raisons de l'augmentation de conserver le compte ou sur mes fuites? La trace de la pile à l'apparence de point de fuite comme 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 les choses correctement, AVPlayerOccasionalCaller est l'objet « opaque » retourné par addBoundaryTimeObserverForTimes:queue:usingBlock:, ou l'observateur de temps.

Était-ce utile?

La solution

Ne pas utiliser -retainCount.

L'absolu conservent comptage d'un objet n'a pas de sens.

Vous devez appeler release exactement le même nombre de fois que vous avez causé l'objet à retenir. Pas moins (sauf si vous aimez les fuites) et, certainement, pas plus (sauf si vous aimez les accidents).

Voir Lignes directrices gestion de la mémoire pour plus de détails.


Dans ce cas spécifique, Retain compte que vous imprimez est tout à fait hors de propos. removeTimeObserver: retient probablement et autoreleasing l'objet. Ne compte pas vraiment; il est un détail de mise en œuvre.

Lorsque vous utilisez Fuites template dans l'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ù un code de la vôtre est le déclenchement d'une supplémentaire conserver. Dans le cas contraire, il pourrait être un bug-cadre.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top