Mac OS X代理上同步请求的随机错误

时间:2013-09-05 21:49:21

标签: objective-c macos nsurlconnection

在MacOS上,我们有一个实现ARC的代理,它会产生一些代理 根据用户的不同,每10或15秒向服务器发出一次请求 设置,并在近一年没有任何问题的情况下工作,并且 就在几周前,该应用程序在一台计算机上崩溃了 一个错误的访问错误,特别是在这一行:

[NSURLConnection sendSynchronousRequest:request returningResponse:&responseCode error:&error];

造成问题的机器的Mac OS X版本是10.7.5,但是在其他具有相同操作系统版本的计算机上运行正常。

我们正在使用同步请求,因为这是我们需要做的事情 工作,但我们花了一些时间使调用异步,但是 问题仍然存在。

因此,在查看其他帖子后,我们添加了一个缓存策略:[请求 setCachePolicy:NSURLRequestReloadIgnoringCacheData];避免任何 缓存请求的问题。应用程序运行得更好,但是 通常在1500 - 1800次迭代(30-40分钟)之间崩溃, 在它从15或20次迭代中崩溃之前。

通过查看堆栈溢出中的另一个问题,我们尝试使用ASIHTTPRequest修复此问题,但问题再次发生(它可能会在迭代#2或#123x ......中崩溃)。

在出现错误之前,请求始终正常,我们是 获取数据并能够正常使用它。

启用NSZombieEnabled选项时,我们没有收到任何消息 应用程序崩溃,try / catch块对我们来说也不起作用 因为错误指向上面的特定行;

[NSURLConnection sendSynchronousRequest:request returningResponse:&responseCode error:&error]

这是我们使用NSURLConnection发出请求的代码:

   NSMutableURLRequest *request = [[NSMutableURLRequest alloc]
   init]; [request setHTTPMethod:@"GET"]; [request setURL:[NSURL
   URLWithString:url]]; [request setTimeoutInterval: TIMEOUT];
   [request setCachePolicy: NSURLRequestReloadIgnoringCacheData];

    NSString *authenticationHeader = [NSString
    stringWithFormat:@"Basic %@", credentials]; [request
    addValue:authenticationHeader
    forHTTPHeaderField:@"Authorization"];

    NSError *error = nil; NSHTTPURLResponse *responseCode = nil;

    NSData *responseData = nil; responseData = [NSURLConnection
    sendSynchronousRequest:request returningResponse:&responseCode
    error:&error];

    if([responseCode statusCode] != 200){ *hasError =[NSString
    stringWithFormat: @"Error getting %@, HTTP status code %li",
    [responseCode statusCode]]; return @"";
    }
    }
    return [[NSString alloc] initWithData:responseData
    encoding:NSUTF8StringEncoding];

这是ASIHttpRequest的代码:

(NSString *)getDataFromURL: (NSString *)urlString withB64Credentials:(NSString *)credentials error:(NSString **)hasError
{
    NSString *response = @"";
    NSURL *url = [NSURL URLWithString:urlString];
    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
    [request setCachePolicy:ASIDoNotReadFromCacheCachePolicy];
    [request setTimeOutSeconds:TIMEOUT];

    NSString *authenticationHeader = [NSString stringWithFormat:@"Basic %@", credentials];
    [request addRequestHeader:@"Authorization" value:authenticationHeader];
    [request startSynchronous];

    NSError *error = [request error];
    if (!error)
        response = [request responseString];
    else
        NSLog(@"%@", [error description]);
    return response;
}

任何建议都将不胜感激。

1 个答案:

答案 0 :(得分:1)

首先,代码对我来说很好。

我会用乐器做一个内存配置文件,以确保应用程序不会泄漏内存。由于此代码可能是您应用程序中调用最多的代码,因此如果应用程序状态损坏,它也更有可能崩溃。您也应该出于同样的原因测试硬件(http://osxdaily.com/2011/05/03/memtest-mac-ram-test/)。

此外,您的代码很容易隔离,因此只需调用您的网址甚至某些公共网址即可创建测试应用。如果你也可以让这个应用程序崩溃,你可以在Apple上提交一个bug。