在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;
}
任何建议都将不胜感激。
答案 0 :(得分:1)
首先,代码对我来说很好。
我会用乐器做一个内存配置文件,以确保应用程序不会泄漏内存。由于此代码可能是您应用程序中调用最多的代码,因此如果应用程序状态损坏,它也更有可能崩溃。您也应该出于同样的原因测试硬件(http://osxdaily.com/2011/05/03/memtest-mac-ram-test/)。
此外,您的代码很容易隔离,因此只需调用您的网址甚至某些公共网址即可创建测试应用。如果你也可以让这个应用程序崩溃,你可以在Apple上提交一个bug。