removeObserver:forKeyPath不起作用

hvo*_*mer 1 cocoa key-value-observing ios

我有一个UIView子类,它注册自己和一个观察者与一个对象NSDictionary.

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

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

我可以看到,当我期待时,我的dealloc确实在运行.这种方法与其他子类化的东西一样正常,比如UIButtonUILabel.

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

知道什么可能阻止这种正确删除?

Rob*_*ier 5

你可能会addObserver:forKey:context:多次打电话.你必须完全平衡对addObserver:...和的呼叫removeObserver:...

你在哪里打电话addObserver:...?你知道如何实例化nib加载的对象吗?你可能希望把addObserver:...awakeFromNibinitWithCoder:.我经常使用一种setup方法来处理可能会或者可能不会从nib文件创建的对象.例如:

- (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;
}
Run Code Online (Sandbox Code Playgroud)