Frage

ich eine Instanz von AVPlayer in meiner Anwendung haben. Ich nutze die Zeit Grenze Beobachtung Funktion:

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

Das Problem ist, dass Instrumente nach mir einige Arrays und Werten am undichten diesen Code irgendwo herum. Ich überprüfte die Beibehaltungszähler der zeit beobachtet Token von AVPlayer auf Orte mit A und B in dem Beispielcode zurückgegeben. Auf dem A Punkt behält die Zählung 2, am Punkt B behalten die Erhöhungen bis 3 zählen (!). einen lokalen Autofreigabepool Hinzufügen ändert nichts. Ich weiß, dass Beibehaltungszähler kein zuverlässiger Metrik ist, aber dies scheint zu sein, faul. Irgendwelche Ideen, warum die Zahl erhöht sich behalten oder über meine Lecks? Der Stack-Trace an den Leckstelle sieht wie folgt aus:

   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:]

Wenn ich die Dinge richtig verstehe, AVPlayerOccasionalCaller ist das „opaque“ Objekt von addBoundaryTimeObserverForTimes:queue:usingBlock: zurückgegeben oder die Zeit Beobachter.

War es hilfreich?

Lösung

Verwenden Sie -retainCount nicht.

Die absolute Beibehaltungszähler eines Objekts bedeutungslos ist.

Sie sollten nennen release genau gleich oft, dass Sie das Objekt verursacht beibehalten werden. Nicht weniger (es sei denn, Sie wie Leckagen) und, natürlich, nicht mehr (es sei denn, Sie wie Abstürze).

Sehen Sie die Memory Management-Richtlinien für weitere Informationen.


In diesem speziellen Fall, die behalten zählen Sie drucken ist völlig irrelevant. removeTimeObserver: ist wahrscheinlich beibehalten und autoreleasing das Objekt. Nicht wirklich wichtig; es ist eine Implementierung Detail.

Bei der Verwendung der Leaks Vorlage in Instrumente, zur Kenntnis, dass das Verrechnungen Gerät zur Aufzeichnung Referenzzähler konfiguriert ist. Wenn Sie für dieses Objekt ein „Leck“, Blick auf die Liste der Referenzzähler Ereignisse erfasst. Es wird wahrscheinlich ein Stapel sein, wo einige Code von Ihnen auslöst ein extra behalten. Wenn nicht, könnte es ein Framework Bug sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top