gpt4 book ai didi

objective-c - 使用键值观察来检测对象何时被释放

转载 作者:行者123 更新时间:2023-12-05 08:17:38 24 4
gpt4 key购买 nike

如何知道对象何时被释放?我正在监听 kvo 更改,但对象在保留计数变为 0 之前被释放,我收到以下警告:

类 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];

最佳答案

您只能对对象支持的键进行键值观察。您想要在此处执行的操作根本不可能 — 一个对象的观察者应该在它到达 dealloc 时全部消失。您将需要构建您的应用程序,以便该对象在需要时一直保留,或者在它消失之前主动告知感兴趣的各方。

查看对象的 retainCount 从来都不是一个好主意。就它的用处而言,它只对调试有用——即便如此,也有更好、更可靠的工具。 retainCount 的结果具有误导性,它并不像大多数人期望的那样工作。观察它为 0 是徒劳的,因为保留计数为 0 的对象不能存在——当保留计数为 1 的对象被释放时,它会被释放,然后你就不能再向它发送消息了. (事实上​​,该框架实际上无法表示 0 保留计数,因为它是一种无法访问的状态。)

关于objective-c - 使用键值观察来检测对象何时被释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18064614/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com