该问题已在此处和此处进行了讨论,但我想知道是否有更可靠的方法来解决此问题,无论您是否有委托 - 在延迟后调用函数时。在程序中的某个点,按一下按钮,就会创建一个对象 - CCLayer。该层创建了几个对象,其中一些在回调中。创建的对象层有一个“后退”按钮,可以破坏它。当对象被破坏并尝试访问不再存在的对象后触发回调等时,我遇到了一个问题——“发送到已释放实例 0x258ba480 的消息”给了我这个好消息。我该如何避免呢?
1)有没有办法杀死回调(因为我显然不再需要它们了) 2)我应该/我可以在回调本身测试这些可能不存在的对象的存在 3)别的什么?
(我的回调是用于检查我从这个杰出网站复制的互联网连接的代码 - 愿它长寿和繁荣 - 使用可达性,我可以通过简单地将其移动到主视图并在子视图,但我不想。)
- (void)testInternetConnection
{
internetReachableFoo = [Reachability reachabilityWithHostname:@"www.google.com"];
// Internet is reachable
internetReachableFoo.reachableBlock = ^(Reachability*reach)
{
// Update the UI on the main thread
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"Yayyy, we have the interwebs!");
//I do the net stuff here
});
};
// Internet is not reachable
internetReachableFoo.unreachableBlock = ^(Reachability*reach)
{
// Update the UI on the main thread
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"Someone broke the internet :(");
noNetMessageLabel.visible=true; //<-------this goes kaboom
noNetFlag=true;
});
};
[internetReachableFoo startNotifier];
}