NSURLConnection sendSynchronousRequest:使用POST时失败

时间:2010-01-17 20:47:34

标签: iphone nsurlconnection exc-bad-access

我正在使用自定义NSURLCache拦截某些网页的调用,以便动态修改它们。在cachedResponseForRequest中:我修改请求,然后使用sendSynchronousRequest将其发送出去。在您尝试提交表单之前,这非常有效。如果有帖子数据则失败。

如果我删除HTTPBody并将请求设置为GET,则成功。但我需要它与POST一起工作。如果我异步发送请求它也有效,这就是为什么我无法弄清楚同步请求失败的原因。

这是我的堆栈跟踪:

日期/时间:2010-01-17 12:37:55.416 -0800
操作系统版本:iPhone OS 3.1.2(7D11)
报告版本:104

异常类型:EXC_BAD_ACCESS(SIGBUS)
例外代码:KERN_PROTECTION_FAILURE位于0x0000001c
坠毁的线程:2

线程2崩溃:
0 CFNetwork 0x0000b4e4 HTTPMessage :: copyHeaderFieldValue(__ CFString const *)+ 18
1 CFNetwork 0x0000b4c8 CFHTTPMessageCopyHeaderFieldValue + 16
2 CFNetwork 0x0000e022 HTTPProtocol :: createStream()+ 328
3 CFNetwork 0x0000de8a HTTPProtocol :: createAndOpenStream()+ 458
4 CFNetwork 0x0000cba2 HTTPProtocol :: startLoad()+ 278
5 CFNetwork 0x0000c8da URLConnectionLoader :: loaderScheduleOriginLoad(_CFURLRequest const *)+ 216
6 CFNetwork 0x0000c77c URLConnectionLoader :: loaderScheduleLoad(_CFURLRequest const *)+ 280
7 CFNetwork 0x0000c5e6 URLConnectionLoader :: LoaderConnectionEventQueue :: processAllEventsAndConsumePayload(XConnectionEventInfo ,long)+ 134
8 CFNetwork 0x0000c53a URLConnectionLoader :: processEvents()+ 60
9 CFNetwork 0x0000a892 URLConnection :: multiplexerClientPerform(RunLoopMultiplexer
)+ 30
10 CFNetwork 0x0000a812 MultiplexerSource :: perform()+ 86
11 CFNetwork 0x0000a7b2 MultiplexerSource :: _ perform(void *)+ 2
12 CoreFoundation 0x000573a0 CFRunLoopRunSpecific + 1908
13 CoreFoundation 0x00056c18 CFRunLoopRunInMode + 44
14基础0x0005a998 + [NSURLConnection(NSURLConnectionReallyInternal)_resourceLoadLoop:] + 172
15基础0x00053ac6 - [NSThread main] + 42
16基金会0x00001d0e __NSThread__main__ + 852
17 libSystem.B.dylib 0x0002b7b0 _pthread_body + 20

如您所见,copyHeaderFieldValue导致崩溃。我不明白的是为什么。

2 个答案:

答案 0 :(得分:0)

EXC_BAD_ACCESS链接到某个地方的错误发布...将保留放在任何地方只是为了查看它是否有效。

答案 1 :(得分:0)

你最终解决了这个问题吗?

问题似乎是当cachedResponseForRequest返回NSCachedURLResponse的新实例时。查看您的other question,即使尝试模仿NSHTTPURLResponse似乎也无法解决崩溃问题。

解决方案不是创建自己的响应,而是从storeCachedResponse中创建的对象返回一个。 通过序列化/反序列化该对象来了解SDURLCache如何做到这一点。