【问题标题】:How to remove an observer for NSNotification in a UIView?如何在 UIView 中删除 NSNotification 的观察者?
【发布时间】:2010-12-23 02:46:11
【问题描述】:

我在 initWithFrame: 下创建的自定义 UIView 中添加了一个观察者。

[[NSNotificationCenter defaultCenter] addObserver:self 
         selector:@selector(updateZipFromLocation:) 
          name:@"zipFoundFromLocation" 
           object:nil];

问题是,这个视图是一个子视图。当视图再次加载时,它再次调用 initWithFrame 消息,从而添加了两个观察者等等。当视图将要消失时,如何移除观察者?因为它是一个UIView,所以它说viewWillDisappear:(BOOL)animated 不是一个有效的方法。有什么想法吗?

【问题讨论】:

  • 提醒一下,KVO指的是key-value observing,和NSNotificationCenter是不同的概念。
  • 糟糕,对这一切还是有点陌生​​。 :)

标签: iphone objective-c cocoa-touch uiview nsnotifications


【解决方案1】:

您说过initWithFrame: 被多次调用,所以我认为这意味着视图正在被销毁并重新创建。您可以在dealloc 中以观察者身份移除视图,当视图不再被任何人保留时会调用该视图:

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

【讨论】:

  • 问题是,dealloc 永远不会被调用。我已经把 NSLog 语句放在那里了。也许我需要删除我的超级视图中的子视图,然后会调用 dealloc。
  • @sudo rm -rf 如果dealloc 没有被调用,但initWithFrame: 被多次调用,听起来你有内存泄漏。确保您在不再需要子视图时立即释放它们(通常紧跟在 addSubview: 之后)。
  • 我将我的子视图创建为实例变量,因此我可以在其他方法中访问它。那我该怎么处理呢?释放它会使我的应用崩溃。
  • @sudo rm -rf addSubview: 将保留子视图,只要父视图仍然存在,因此您可以安全地释放之后立即添加的视图。如果您仍然需要对它的引用,您可以保留它,直到它从超级视图中删除或直到调用 viewDidUnload(此时您应该将其设置为 nil)。如果它的生命周期与您的视图控制器的生命周期不一致,那么在更细粒度的级别上保留和释放它是合适的。
  • 啊,我刚刚修好了。我忘了删除观察者,所以它试图在不存在的视图上运行一个方法。感谢您的帮助!我会尽快接受它作为答案。
猜你喜欢
  • 2015-04-25
  • 2011-09-22
  • 2015-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多