removeObserver:forKeyPath不起作用

时间:2012-03-15 02:34:36

标签: ios cocoa key-value-observing

我有一个UIView子类注册自己,一个观察者注册NSDictionary中的对象。

当删除此视图时(删除其包含视图时),我在视图的dealloc方法中调用removeObserver:forKey方法。

该应用程序稍后会崩溃,因为我的视图对象实际上并未从观察者中删除。我通过字典的observationInfo证实了这一点。

我可以看到,当我期待时,我的dealloc确实在运行。同样的方法可以与其他子类化的东西一起使用,例如UIButtonUILabel

如果有帮助:其他子类化事物与此视图之间的唯一区别是其他事物是从NIB实例化的,其中此视图是用代码构建的......

知道可能阻止这种情况正确删除的原因吗?

1 个答案:

答案 0 :(得分:5)

您可能多次致电addObserver:forKey:context:。您必须完全平衡对addObserver:...removeObserver:...

的来电

你在哪里打addObserver:...?你知道如何实例化nib加载的对象吗?您可能希望将addObserver:...放入awakeFromNibinitWithCoder:。我经常对可能会或可能不会从nib文件创建的对象使用setup方法。例如:

- (void)setup {
  // Do setup work here
}

- (id)initWithFrame:(CGRect)frame {
  self = [super init];
  if (self) {
    [self setup];
  }
  return self;
}

- (id)initWithCoder:(NSCoder *)coder {
  self = [super initWithCoder:coder];
  if (self) {
    [self setup];
  }
  return self;
}