2010-11-12 37 views
2

泄漏在我的應用程序中有一個AVPlayer的實例。我用的時間邊界觀測功能:[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]; 
    }]]; 

的問題是,根據儀器我泄露了一些數組和值圍繞某處此代碼。我在示例代碼中檢查了標記爲A和B的位置上由AVPlayer返回的時間觀察令牌的保留計數。在A點保留計數是2,在B點保留計數增加到3(!)。添加本地autorelease池不會改變任何東西。我知道保留數不是一個可靠的指標,但這似乎是可疑的。關於爲什麼保留數增加或關於泄漏的任何想法?在泄漏點的堆棧跟蹤看起來是這樣的:

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

如果我理解正確的事情,AVPlayerOccasionalCalleraddBoundaryTimeObserverForTimes:queue:usingBlock:回來的時候觀察者的「不透明」對象,或。

+0

您是否找到了解決方案?我在使用這個觀察者時泄漏了一個__NSArrayI和CMTimeAsValue對象 – Bastian 2011-05-23 13:25:00

+0

不,我已經切換到不同的視頻回放技巧來擺脫觀看所有時間邊界的時間邊界。 – zoul 2011-05-24 07:00:06

+0

感謝您的回答:) – Bastian 2011-05-24 08:45:16

回答

2

請勿使用-retainCount。

對象的絕對保留數是沒有意義的。

您應該致電release完全相同的次數導致對象被保留。沒有更少(除非你喜歡泄漏),當然,沒有更多(除非你喜歡崩潰)。

查看Memory Management Guidelines的全部細節。


在這種特定情況下,您打印的保留計數完全不相關。 removeTimeObserver:可能會保留並自動釋放該對象。沒關係;它是一個實現細節。

當使用泄漏模板儀器,注意分配儀器配置,以創紀錄的引用計數。當您檢測到「泄漏」時,請查看該對象的引用計數事件列表。可能會有一堆你的一些代碼觸發額外的保留。如果沒有,它可能是一個框架錯誤。