我正在通过创建NSOperation并同步打开NSURLConnections来实现服务器的后端数据加载。
此代码在模拟器和设备中都运行良好,直到我添加了一个进度条,其中包含返回主线程的通知。
- (void)start {
// stop execution if it's cancelled
if([self isCancelled]) {
[self willChangeValueForKey:@"isFinished"];
finished = YES;
[self didChangeValueForKey:@"isFinished"];
return;
}
// If the operation is not canceled, begin executing the task.
[self willChangeValueForKey:@"isExecuting"];
[NSThread detachNewThreadSelector:@selector(main ) toTarget:selfwithObject:nil];
executing = YES;
[self didChangeValueForKey:@"isExecuting"];
}
现在我在同步调用中遇到EXC_BAD_ACCESS崩溃。
NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@/index.php", rootURL]];
NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:url];
[urlRequest setHTTPMethod:@"POST"];
[urlRequest setHTTPBody:[bodyString dataUsingEncoding:NSUTF8StringEncoding]];
[[NSURLCache sharedURLCache] removeAllCachedResponses];
[[NSURLCache sharedURLCache] setMemoryCapacity:0];
[[NSURLCache sharedURLCache] setDiskCapacity:0];
NSError *error = nil;
NSURLResponse *response = nil;
receivedData = [[NSURLConnection sendSynchronousRequest:urlRequest returningResponse:&response error:&error] mutableCopy];
堆栈跟踪运行如下:
#0 0x3430debc in objc_msgSend ()
#1 0x3136f996 in NSPopAutoreleasePool ()
#2 0x31374160 in -[NSAutoreleasePool release] ()
#3 0x331a0408 in _UIApplicationHandleEvent ()
#4 0x325339c4 in PurpleEventCallback ()
#5 0x3147a52a in CFRunLoopRunSpecific ()
#6 0x31479c1e in CFRunLoopRunInMode ()
#7 0x3314ec08 in -[UIApplication _run] ()
#8 0x3314d230 in UIApplicationMain ()
#9 0x00002ab0 in main (argc=1, argv=0x2ffff504)
使用NSZombieEnabled,我得到了
*** -[NSDateComponents release]: message sent to deallocated instance 0x172fd0
我知道正在建立连接(查看服务器日志,请求正在进行)。在NSURLConnection之前的NSOperation代码中,没有任何NSDateComponent对象被分配。
我一直试图找出我突然错误的NSURLConnection,让它恨我。
非常感谢任何帮助!
答案 0 :(得分:1)
虽然我不确切地知道你的问题是什么,但我知道我曾经在使用NSURLConnection时遇到随机错误和崩溃。然后我发现ASIHTTPRequest并且从未回头。它是NSURLConnection的替代品,并且在CFNetwork上运行。它非常稳定(我在我的所有项目中使用它)并附带一些好东西,比如内置进度条支持和部分下载恢复。它甚至可以直接写入磁盘以保存在RAM中,这在iPhone中非常重要。
答案 1 :(得分:0)
我也在开发者论坛上发布了这个问题,并得到了删除并发性的建议。我删除了违规行:
[NSThread detachNewThreadSelector:@selector(main ) toTarget:selfwithObject:nil];
我也停止了覆盖开始,并且只覆盖了主要部分。
NSURLConnection停止崩溃。