0

インターネット接続を確認するために Reachability .h および .m ファイルをアプリに組み込むまで、私のアプリは完全に機能していました。ほとんどの場合、すべてが問題なく実行されます (すべての Web ページが正しく読み込まれ、テストのために意図的に Airport をオフにすると、Reachability が正常にそれをキャッチします) - 今では、恐ろしい " Exc-Bad-Access" エラー... Instruments を実行したところ、ゾンビが見つかりました - スクリーン グラブを参照してください: RefCt 列に注意してください - カウントが 20 に達しました!

"RefCt" 列を見ると、15 に達していることがわかります。私はそれが 20 を超えているのを見ました! 「Responsible Caller」列 (右端) には、認識できないあらゆる種類のメソッドが表示されます。また、実行中にシステムによって内部的に呼び出されたと仮定しています。 -時間?

いずれにせよ、私は Apple の到達可能性コードと指示に非常に注意深く従っただけでなく、この非常にランクの高いスタックオーバーフロー スレッドのヒント: iOS または OSX でアクティブなインターネット接続を確認する方法?

しかし、私はまだこれらの不可解なクラッシュを受けています。

誰でもアドバイスを提供できますか?

コードは次のとおりです。

#import "Reachability.h"


-(void) viewWillAppear:(BOOL)animated
{
   // check for internet connection
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(checkNetworkStatus:) name:kReachabilityChangedNotification object:nil];

internetReachable = [[Reachability reachabilityForInternetConnection] retain];
[internetReachable startNotifier];

// check if a pathway to a random host exists
hostReachable = [[Reachability reachabilityWithHostName: @"www.apple.com"] retain];
[hostReachable startNotifier];

// now patiently wait for the notification
}



-(void) viewDidLoad {

    url = [NSURL URLWithString: @"http://www.google.com"];
    NSURLRequest *req = [NSURLRequest requestWithURL: url];
    [webPageView loadRequest:req];
    [super viewDidLoad];
}



-(void) checkNetworkStatus:(NSNotification *)notice
{
        // called after network status changes

    NetworkStatus internetStatus = [internetReachable currentReachabilityStatus];

    switch (internetStatus) 
    {
        case NotReachable:
        {
            [self displayMessageWithTitle:@"ERROR"
                               andMessage:@"Unable To Connect to Internet"
                              andOKButton:@"OK"];
            [self dismissModalViewControllerAnimated:YES];
            break;

        }
        case ReachableViaWiFi:
        {
            NSLog(@"The internet is working via WIFI.");

            break;

        }
        case ReachableViaWWAN:
        {
            NSLog(@"The internet is working via WWAN.");

            break;

        }
    }

    NetworkStatus hostStatus = [hostReachable currentReachabilityStatus];
    switch (hostStatus)
    {
        case NotReachable:
        {
            // NSLog(@"A gateway to the host server is down.");

            [self displayMessageWithTitle:@"ERROR"
                               andMessage:@"Host Not Reachable"
                              andOKButton:@"OK"];
            [self dismissModalViewControllerAnimated:YES];
            break;

        }

        case ReachableViaWiFi:
        {
            NSLog(@"A gateway to the host server is working via WIFI.");

            break;

        }

        case ReachableViaWWAN:
        {
            NSLog(@"A gateway to the host server is working via WWAN.");

            break;

        }
    }
}



- (void)webViewDidStartLoad:(UIWebView *)webView {
    [activityIndicator startAnimating];
}


- (void)webViewDidFinishLoad:(UIWebView *)webView {
    [activityIndicator stopAnimating];
}


// Since this ViewController is presented Modally, this method removes it 
// via a button click:
-(IBAction) dismissWebTixView:(id)sender {
    [self dismissModalViewControllerAnimated:YES];
}




-(void) viewWillDisappear:(BOOL)animated {
    NSLog(@"In webForTix's 'viewWillDisappear' method....");
    [[NSNotificationCenter defaultCenter] removeObserver:self
name:kReachabilityChangedNotification
                                              object:nil];
}


// Was told it might be good to put "removeObserver" here and not in viewWillDisappear
// well neither worked - the App still crashes....
- (void)dealloc
{
    //NSLog(@"In webForTix's dealloc method....");
//    [[NSNotificationCenter defaultCenter] removeObserver:self
//                                                        name:kReachabilityChangedNotification
//                                                  object:nil];
NSLog(@"In webForTix's dealloc method - removedObserver...");
[super dealloc];

}

4

1 に答える 1

2

addObserver と removeObserver の呼び出しのバランスを慎重に取る必要があります。

vieWillAppear で通知用のオブザーバーを追加した場合は、viewWillDisappear でそれを削除する必要があります。

オブザーバーを 2 回追加すると、同じ通知に対して 2 回呼び出され、両方の通知を取り除くために removeObserver を 2 回呼び出す必要があります。

明らかなメモリ管理の問題は見られませんでした。投稿したすべてのコードが自動解放オブジェクトを作成しているように見えますが、これは問題ありません。

于 2011-12-03T02:03:08.027 に答える