对于需要在我的应用程序中联网的对象,我有一个“互联网感知”基类。所有需要互联网感知的对象都继承自它。正如你可以想象的那样,我分配和释放了很多这些对象。
Internet 感知基类具有以下代码,用于与用于检查 Internet 状态的 Reachability 类进行交互。
#import "Reachability.h"
- (id) init {
...
self.internetReachable = [Reachability reachabilityForInternetConnection];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(checkNetworkStatus) name:kReachabilityChangedNotification object:nil];
[self.internetReachable startNotifier];
...
}
- (void) dealloc
{
[self.internetReachable stopNotifier];
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
一旦我的应用程序中的互联网状态发生变化,应用程序就会崩溃并出现以下错误:
*** -[Reachability isKindOfClass:]:消息发送到已释放实例 0x1e249a30
我已经打开了僵尸,并将问题追溯到 Reachability.m 中的以下代码行
NSCAssert([(NSObject*) info isKindOfClass: [Reachability class]], @"info was wrong class in ReachabilityCallback");
不幸的是,除了停止监听 NSNotifcations 和停止通知程序之外,我不确定我的对象还能做些什么来避免这个错误。
任何帮助或建议都会很棒。
谢谢
维生素B
编辑:
好的,所以按照下面答案的建议,我在带有分配的工具中运行它,这就是保留计数历史。
正如我所怀疑的那样,它是一个我释放的对象,它被 Foundation(即 NSNotifcationCenter)而不是我自己调用。
我的互联网对象有一个指向可达性对象的强指针。当它们被释放时,Reachability 对象也是如此。僵尸是可达性对象。在我的 Internet 对象的 dealloc 中,我调用了 removeObserver,但基础仍在调用已释放的对象。我不明白为什么...