【发布时间】:2013-08-05 17:58:45
【问题描述】:
我如何知道一个对象何时被释放?我正在监听 kvo 更改,但在保留计数变为 0 之前对象 get 已被释放,并且我收到以下警告:
类 MyViewController 的实例 0x16562be0 已被释放,而键值观察器仍向其注册。观察信息被泄露,甚至可能被错误地附加到其他对象上。在 NSKVODeallocateBreak 上设置断点以在调试器中停止。以下是当前观察信息:
基本上我要做的是检测模型何时被解除。 我不能使用 Delegate,因为呈现的 viewController 是动态的,而我的 mainViewController 除了它们是 UIViewController 的子类之外,对它们一无所知。
[anotherViewController addObserver:self forKeyPath:@"retainCount" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionInitial | NSKeyValueObservingOptionOld | NSKeyValueObservingOptionPrior context:nil];
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
// Here check for the changes and see of the new value is 0 or not
}
我也尝试监听 viewController 的 superView 被更改为 nil
[anotherViewController.view addObserver:self forKeyPath:@"superView" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionInitial | NSKeyValueObservingOptionOld | NSKeyValueObservingOptionPrior context:nil];
【问题讨论】:
-
为了更具体地了解您的情况,忽略所有其他应该从不使用 retainCount 的充分理由,KVO 仅适用于类符合 KVO 的属性。我以前从未有过关心的理由,但我敢打赌,retainCount 不符合 KVO。您需要采取完全不同的方法来应对视图控制器被解除(或者它是否被解除分配?它们不是同一件事......)。
-
@AndrewMadsen:从字面上看,对于
retainCount,类字面上不能符合KVO,因为他在这里寻找的是,因为它永远不会是0不是零。 -
@aryaxt:你应该问一个单独的问题。
-
如果主视图控制器知道的唯一是其他视图控制器是
UIViewController的实例,为什么它需要使用KVO或以其他方式知道它们何时被解雇了?相反,如果主视图控制器需要知道另一个视图控制器已被解除,那么它需要知道的不仅仅是视图控制器是视图控制器。
标签: objective-c key-value-observing