2012-11-04 31 views
0

不知道我在问这个问题,但无论如何我都会试一试。在对象释放期间取消注册对象的观察者

我有一个程序,它调用的代码,这一点......

[localCalculateTimeFiles addObserver:self 
     forKeyPath:@"arraystatuscounter" 
      options:NSKeyValueObservingOptionNew 
      context:NULL]; 

最终localCalculateTimeFiles消失,我想removeObserver当前代码位(说句不好听)。如果我什么都不做,并且localCalculateTimesFiles消失而没有执行正确的removeObserver,则运行时将引发异常。我认为这种方式过去常常是一种警告,但现在该方案暂停。

比方说,我在正确的时间将所有的对象指针都放在正确的位置。我想要做的是让localCalculateTimeFiles在下路(可以这么说)的时候移除观察者,当它被释放时。

看来,根据苹果的文档,我可以添加一个方法来localCalculateTimeFiles看起来像这样做的工作......

- (void)finalize { 
    if (log_file != NULL) { 
     fclose(log_file); 
     log_file = NULL; 
    } 
    [super finalize]; 
} 

我更换逻辑来处理LOG_FILE新将取消注册观察者的逻辑。很明显,我必须确保我的所有指针都是正确的,以确保removeObserver方法具有正确的操作对象。给我正确的做,这是有道理的,还是我完全没有?

回答

4

我不认为敲定是正确的地方。

取消注册观察的最佳位置在您的dealloc方法中,该方法在对象被删除之前被调用。

+0

+1'-finalize'是a)仅由垃圾收集器调用,b)由于您在此时应该使用ARC而不是垃圾收集,因此不推荐使用。 – Caleb

+0

好的....所以我应该简单地重做dealloc方法。我会在本周尝试一下,然后在完成工作后按下投票按钮。 –