可达性崩溃应用程序

时间:2011-12-02 12:58:48

标签: iphone crash reachability

我刚刚实施了Apple的Reachability代码,我的应用程序现在以完全不一致和随机的方式崩溃:它可以连续成功加载20个网页 - 但在21日崩溃。尝试,或者它可能在第二次之后崩溃。网页加载尝试

Instruments / NSZombies显示出一些奇怪的东西:RefCt高达20(!),“负责的调用者”是几个不同的:[UIRuntimeConnection initWithCoder],[UINib instantiateWithOwner:options],[NSKeyedUnarchiver _decodeArrayOfObjectsForKey: ]等 这是正常的吗?

或者我应该只关注最后一位负责任的来电者? 那些是[UIWindowController transitionViewDidComplete:fromView:toView:](它将RefCt带到0),以及 [UIWebView webView:didFinishLoadForFrame:](将RefCt降为-1)?

如何调试和解决此问题?

以下是代码:

#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:
        {
            //NSLog(@"The internet is down.");
            //self.internetActive = NO;   // (That's a BOOL variable)
            [self displayMessageWithTitle:@"ERROR"
                               andMessage:@"Unable To Connect to Internet"
                              andOKButton:@"OK"];
            [self dismissModalViewControllerAnimated:YES];
            break;

        }
        case ReachableViaWiFi:
        {
            //NSLog(@"The internet is working via WIFI.");
            //self.internetActive = YES;    //

            break;

        }
        case ReachableViaWWAN:
        {
            //NSLog(@"The internet is working via WWAN.");
            // self.internetActive = YES;   // (That's a BOOL variable)

            break;

        }
    }

    NetworkStatus hostStatus = [hostReachable currentReachabilityStatus];
    switch (hostStatus)
    {
        case NotReachable:
        {
            // NSLog(@"A gateway to the host server is down.");
            // self.hostActive = NO;    // (That's a BOOL variable)

            [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.");
            //self.hostActive = YES;    // (That's a BOOL variable)

            break;

        }

        case ReachableViaWWAN:
        {
            //NSLog(@"A gateway to the host server is working via WWAN.");
            // self.hostActive = YES;   // (That's a BOOL variable)

            break;

        }
    }
}



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


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


// Since this ViewController is presented Modally, this method removes it:
-(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];
}


// Read somewhere that it might be better to put the removeObserver
// call here rather than viewWillDisappear...tried both - still get 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 个答案:

答案 0 :(得分:-1)

尝试使用此代码,确保它可以正常工作。

将开发者apple中的Reachability.h和Reachability.m文件包含到您的项目中。从SDK库到项目导入SystemConfiguration框架。然后将以下GlobalFunction.h和GlobalFunction.m文件添加到项目中

//GlobalFunction.h


#import <Foundation/Foundation.h>

@class Reachability;

@interface GlobalFunction  :  NSObject
{
Boolean internetActive;
Boolean hostActive;

Reachability * internetReachable;
Reachability * hostReachable;
Reachability * wifiReach;

}

@property (readwrite,assign) Boolean internetActive;
@property (readwrite,assign) Boolean hostActive;

- (Boolean) checkNetworkStatus;
- (BOOL)connectedToNetwork;
@end


//GlobalFunction.m

#import "GlobalFunction.h"
#import "Reachability.h"
#include <netinet/in.h>
#import <SystemConfiguration/SCNetworkReachability.h>

@implementation GlobalFunction

@synthesize  internetActive,hostActive;
- (id)init
{
 self = [super init];
 if (self) {
     // Initialization code here.
}

return self;
}



//  Checking Internet Connectivity
 - (Boolean) checkNetworkStatus//:(NSNotification *)notice
 {
 // called after network status changes
internetReachable = [[Reachability reachabilityForInternetConnection] retain];
[internetReachable startNotifier];

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

NetworkStatus internetStatus = [internetReachable currentReachabilityStatus];
switch (internetStatus)
{
    case NotReachable:
    {
        //NSLog(@"The internet is down.");
        //[self ShowMsg:@"The internet connection appears to be offline."];
        self.internetActive = NO;
        break;

    }
    case ReachableViaWiFi:
    {
        //NSLog(@"The internet is working via WIFI.");
        self.internetActive = YES;

        break;

    }
    case ReachableViaWWAN:
    {
        //NSLog(@"The internet is working via WWAN.");
        self.internetActive = YES;

        break;

    }
    default :
        self.internetActive = YES;
        break;

}

NetworkStatus hostStatus = [hostReachable currentReachabilityStatus];
switch (hostStatus)

{
    case NotReachable:
    {
        //NSLog(@"A gateway to the host server is down.");
        self.hostActive = NO;

        break;

    }
    case ReachableViaWiFi:
    {
        //NSLog(@"A gateway to the host server is working via WIFI.");
        self.hostActive = YES;

        break;

    }
    case ReachableViaWWAN:
    {
        //NSLog(@"A gateway to the host server is working via WWAN.");
        self.hostActive = YES;

        break;

    }
}

[hostReachable release];
[internetReachable release];

return self.internetActive;
}

- (BOOL)connectedToNetwork  {
// Create zero addy
struct sockaddr_in zeroAddress;
bzero(&zeroAddress, sizeof(zeroAddress));
zeroAddress.sin_len = sizeof(zeroAddress);
zeroAddress.sin_family = AF_INET;
// Recover reachability flags
SCNetworkReachabilityRef defaultRouteReachability =   SCNetworkReachabilityCreateWithAddress(NULL, (struct sockaddr*)&zeroAddress);
SCNetworkReachabilityFlags flags;
BOOL didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags);
CFRelease(defaultRouteReachability);
if (!didRetrieveFlags)
{
    //NSLog(@"Error. Could not recover network reachability flags");
    return 0;
}
BOOL isReachable = flags & kSCNetworkFlagsReachable;
BOOL needsConnection = flags & kSCNetworkFlagsConnectionRequired;
//below suggested by Ariel
BOOL nonWiFi = flags & kSCNetworkReachabilityFlagsTransientConnection;
NSURL *testURL = [NSURL URLWithString:@"http://www.apple.com/"]; //comment by friendlydeveloper: maybe use www.google.com
NSURLRequest *testRequest = [NSURLRequest requestWithURL:testURL cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:20.0];
//NSURLConnection *testConnection = [[NSURLConnection alloc] initWithRequest:testRequest delegate:nil]; //suggested by Ariel
NSURLConnection *testConnection = [[[NSURLConnection alloc] initWithRequest:testRequest delegate:nil] autorelease]; //modified by friendlydeveloper
return ((isReachable && !needsConnection) || nonWiFi) ? (testConnection ? YES : NO) : NO;
}

-(void)dealloc {
internetReachable=nil;
hostReachable=nil;
wifiReach=nil;

[super dealloc];
}

@end




------>Just write the code for checking internet connection
 #import<GlobalFunction.m>

-(void)viewDidLoad
{
 if([globalFunc checkNetworkStatus])
{
    [self ShowAlert:@"Internet Connection appears"];
}
else
{
    [self ShowAlert:@"The Internet connection appears to be offline.."];
}
}