removeObserver: forKeyPath не работает - PullRequest
1 голос
/ 15 марта 2012

У меня есть подкласс UIView, который регистрирует себя и наблюдателя с объектом в NSDictionary.

Когда это представление удаляется (когда удаляется содержащее его представление), я вызываю метод removeObserver:forKey в методе dealloc представления.

Приложение позже будет аварийно завершено, потому что мой объект просмотра фактически не удаляется из наблюдателей. Я подтвердил это в словарном наблюденииInfo.

Я вижу, что мой dealloc действительно работает, когда я ожидал. Этот же метод отлично работает с другими подклассами, такими как UIButton и UILabel.

Если это поможет: единственное различие между другими подклассами и этим представлением заключается в том, что другие объекты создаются из NIB, где это представление встроено в код ...

Есть идеи, что может помешать этому удалить должным образом?

1 Ответ

5 голосов
/ 15 марта 2012

Вы, вероятно, звоните addObserver:forKey:context: несколько раз. Вы должны точно сбалансировать звонки на addObserver:... и removeObserver:...

Куда ты звонишь addObserver:...? Знаете ли вы, как создаются объекты, загруженные nib? Вы, вероятно, хотите поместить addObserver:... в awakeFromNib или initWithCoder:. Я часто использую метод 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;
}
...