- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个 ViewController
类,它有一个模型属性,我想在模型属性发生变化时观察它。在我的模型对象中,我有一个属性会在我的应用程序后台定期更新。当它更新时,我需要在我的 ViewController
中执行代码。
为此,我在我的 ViewController
viewDidLoad
方法中为我的模型创建了一个观察者。
[ModelObject addObserver:self
forKeyPath:@"State"
options:NSKeyValueObservingOptionNew
context:nil];
如您所见,这没什么特别的,只要我将 View 显示在屏幕上,观察方法就会正常运行。如果我从父 View 中删除上述 View ,当我的 ModelObject
实例 Mode
属性更改时,我会收到一条 EXC_BAD_ACCESS
错误消息。具体来说,我的应用程序在更新 Mode
属性的那一行崩溃了,我在 ModelObject 实例中的以下代码行收到了几乎无用的 EXC_BAD_ACCESS
。
//This is located in a method that periodically toggles the value of "State"
[self setState: 2];
我假设这个问题的解决方案是在我的 ViewController
从中删除时调用 [ModelObject removeObserver: self forKeyPath:@"State"]
它是父 subview 数组。但是,我在我的 viewDidUnload
方法中添加了那行代码,但我发现 viewDidUnload
方法没有被调用。我不确定那是否是正确的地方,但它需要去一些地方。
我可能做错了什么?我知道问题与 KVO 相关,因为如果我删除观察,应用程序可以正常工作。我的模型实例可以随心所欲地切换这个值,而且我的应用程序永远不会崩溃。当从其父 View 数组中删除观察 View 时,我应该怎么做才能确保我的观察者被正确删除?
最佳答案
我通常喜欢将 addObserver:
和 removeObserver:
放在 viewWillAppear:
和 viewWillDisappear:
中。我发现这些书挡比 viewDidLoad
和 viewDidUnload
更可靠。
关于objective-c - 我应该什么时候调用 removeObserver :forKeyPath from within a closing ViewController class that is observing a persistant Model class?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9116557/
简短版本: -removeObserver:forKeyPath:有什么用? ? 为什么不总是使用 -removeObserver:forKeyPath:context: ? 长版 在开发 Cocoa
我想添加一个 View Controller 作为通知的观察者。 调用选择器方法时,我会提醒用户。我希望只有当此 View Controller 是顶 View Controller 时才会出现此警报
我有一个 UITextView 子类,我在其中添加了一个 NSNotificationCenter 观察器。但是我在哪里再次删除观察者呢? 我的代码: _textDidChangeNotificati
该应用程序应仅加载本地发布的帖子。使用 GeoFire 在 FB 中有一个分支“posts_location”。我想先填充“nearbyPostsKeys”数组,然后从 FB 的分支帖子中加载那些引用
我有下一个代码: @implementation SplashViewVC - (void)viewDidLoad { [super viewDidLoad]; self.splash
以下是否删除了所有按名称添加的 NSNotificationCenter.defaultCenter View ? NotificationCenter.default.removeObserver(
我创建了一个观察器来跟踪AVPlayer的“速率”。每当AVPlayer速率按预期变化时,都会显示观察者通知。但是,当我尝试在AVPlayer正在播放的项目上结束播放时删除观察者时,出现以下崩溃: *
当我注释掉... // [[NSNotificationCenter defaultCenter] removeObserver:self name:@"LoadRequestFromAppDel"
我有一个 View 可以像这样在 init 上观察自身的值: [self addObserver:self forKeyPath:@"focusPointOfInterestIndicator" op
我一直在观察一个值,直到用户注销。但是当我调用 self.ref.removeObserver(withHandle: self.handle) self.ref.removeAllObservers
我在事件线程中有一个通知中心: Poco::NotificationCentre nc; // publicly visible // (thread main loop which will p
通常我在 viewWillAppear 中添加我的观察者,并在 viewWillDisappear 中移除它们。在这种情况下,即使在 View 消失后,我也需要其中一名观察员继续,以便它可以完成一些工
这是我的观察事件代码: let databaseRef = FIRDatabase.database().reference() let query = databaseRef
-(void)viewDidAppear:(BOOL)animated { NSOperationQueue *mainQueue = [NSOperationQueue ma
基本上,我有一个 view1,它在某个时候调用 view2(通过 presentModalViewController:animated:)。当按下 view2 中的某个 UIButton 时,vie
众神将许多习惯空降到我与世隔绝的丛林村庄,例如: - (void) dealloc { [[NSNotificationCenter defaultCenter] removeObserver:s
我看过NSNotification addObserver/removeObserver 放在viewDidLoad/viewDidUnload , viewDidAppear/viewDidDisa
我遇到了从 NSNotificationCenter 中删除观察者的正确位置的问题 // DetailOfSomethingViewController @implementation DetailO
有各种与此主题相关的问题,但没有一个能回答我的问题。 我想在对象被释放时从对象中removeObserver。我正在使用 KVO,因为需要观察多个项目,而 NSNotification 在这种情况下会
我有一个带有按钮操作的 View Controller : @IBAction func MultiplayerButtonClick(sender: AnyObject) {
我是一名优秀的程序员,十分优秀!