用对象删除dealloc中的观察者

时间:2014-09-22 07:02:45

标签: ios objective-c

我宣布一个对象为:

AVQueuePlayer *queuePlayer;
代码中的

我添加了一个观察者:

- (void) playStreamedTrack: (Track *) track {

[queuePlayer addObserver:self forKeyPath:@"status" options:0 context:nil];

        [queuePlayer addPeriodicTimeObserverForInterval:CMTimeMakeWithSeconds(1, NSEC_PER_SEC)
                                                  queue:nil
                                             usingBlock:^(CMTime time) {
                                                 progress = time.value/time.timescale;
                                             }];
}

我试图将观察者移除,但不起作用

- (void)dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:self];

    [queuePlayer removeObserver:self forKeyPath:@"status" context:nil];
}

我该如何删除观察者?

1 个答案:

答案 0 :(得分:3)

正如[AVPlayer addPeriodicTimeObserverForInterval] doc所述,您必须保留返回值,以便以后能够删除观察者。

所以你需要在类接口中添加一个属性

@property (nonatomic, strong) id playerObserver;

在创建观察者

时存储返回的值
if(self.playerObserver)
    [queuePlayer removeTimeObserver:self.playerObserver];
self.playerObserver = [self.queuePlayer addPeriodicTimeObserverForInterval:CMTimeMakeWithSeconds(1, NSEC_PER_SEC)
                                                                     queue:nil
                                                                usingBlock:^(CMTime time) {
                                                                    progress = time.value/time.timescale;
                                                                }];

在dealloc中,您可以释放观察者

- (void)dealloc {    
    [queuePlayer removeTimeObserver:self.playerObserver];
    [queuePlayer removeObserver:self forKeyPath:@"status" context:nil];
}

请注意,在您的块中,您可能需要对您的实例使用弱引用以避免保留周期。如果你的进步"变量实际上是一个实例变量,你必须使用像这样的弱引用:

__typeof__(self) __weak weakSelf = self;

self.playerObserver = [self.queuePlayer addPeriodicTimeObserverForInterval:CMTimeMakeWithSeconds(1, NSEC_PER_SEC)
                                                                     queue:nil
                                                                usingBlock:^(CMTime time) {
                                                                    weakSelf.progress = time.value/time.timescale;
                                                                }];