Есть ли эксперты по доступности? - PullRequest
0 голосов
/ 03 декабря 2011

Мое приложение работало превосходно, пока я не включил в него файлы Rehability .h и .m для проверки интернет-соединения. Хотя по большей части все по-прежнему работает отлично (все веб-страницы загружаются правильно, и когда я целенаправленно отключаю свой Аэропорт, чтобы проверить вещи, Reachability ловит это изящно) - теперь я получаю необъяснимые сбои в нечетные моменты, с ужасом » Exc-Bad-Access "ошибка ... Я запустил Инструменты и нашел Зомби - см. Скриншот: Note the RefCt column - the count reached 20!

Глядя на столбец «RefCt», вы можете видеть, что он достигает 15 - и я видел, что он превышает 20! В столбце «Ответственный абонент» (в крайнем правом углу) я вижу все виды методов, которые я не распознаю - и чей вызов я определенно не инициировал - я предполагаю, что они были вызваны системой внутри во время выполнения -время

В любом случае, я очень тщательно следовал коду и инструкциям Apple Reachability, а также советам из этого очень высоко оцененного потока stackoverflow: Как проверить активное подключение к Интернету на 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];

}

1 Ответ

2 голосов
/ 03 декабря 2011

Вы должны тщательно сбалансировать вызовы addObserver и removeObserver.

Если вы добавляете наблюдателя для уведомления в vieWillAppear, вам нужно удалить его в viewWillDisappear.

Если вы добавили наблюдателя дваждыВам дважды будет звонить для одного и того же уведомления, и вам придется дважды вызывать removeObserver для того, чтобы избавиться от обоих уведомлений.

Я не видел каких-либо очевидных проблем с управлением памятью.Похоже, весь код, который вы разместили, создает автоматически выпущенные объекты, что должно быть хорошо.

...