この問題はこことここで議論されていますが、デリゲートがあるかどうかに関係なく、これを解決するためのより確実な方法があるのではないかと思います-関数が遅延後に呼び出される場合。プログラムのある時点でボタンを押すと、オブジェクト (CCLayer) が作成されます。そのレイヤーはいくつかのオブジェクトを作成し、そのうちのいくつかはコールバックで作成されます。その作成されたオブジェクト レイヤーには、それを破棄する「戻る」ボタンがあります。オブジェクトが破棄された後にコールバックなどがトリガーされ、もう存在しないオブジェクトにアクセスしようとすると、問題が発生します。「割り当て解除されたインスタンス 0x258ba480 に送信されたメッセージ」がこの良いニュースを提供します。どうすればそれを回避できますか?
1)コールバックを強制終了する方法はありますか(明らかにもう必要ないため)2)コールバック自体でこれらの存在しない可能性のあるオブジェクトの存在をテストする必要があります/テストできますか3)何か他のものはありますか?
(私のコールバックは、Reachability を使用して、この輝かしい Web サイトからコピーしたインターネット接続をチェックするためのコードです。子ビューですが、私はしたくありません。)
- (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];
}