我看到的是一个POST请求我做结束后发生的10或20秒的崩溃(didReceiveResponse
,didReceiveData
而connectionDidFinishLoading
所有消防在飞机坠毁前发生了好).
这是我用来发出请求的代码:
NSURL* url = [[NSURL alloc] initWithString:urlString]; [urlString release]; NSData* requestData = [jsonData dataUsingEncoding:NSUTF8StringEncoding]; NSString* requestDataLengthString = [[NSString alloc] initWithFormat:@"%d", [requestData length]]; NSMutableURLRequest* request = [[NSMutableURLRequest alloc] initWithURL:url]; [request setHTTPMethod:@"POST"]; [request setHTTPBody:requestData]; [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; [request setValue:requestDataLengthString forHTTPHeaderField:@"Content-Length"]; [request setTimeoutInterval:30.0]; [url release]; [requestData release]; [requestDataLengthString release]; m_URLConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; [request release];
什么是这个崩溃非常奇怪的是这样的:如果我不叫 setHTTPBody我的NSData
对象,setValue:@"application/json"
为Content-Type
和setValue:requestDataLengthString
对Content-Length
,碰撞也不会发生.我对发生的事情感到十分困惑.据我所知,崩溃直接NSData
与我的请求发送对象有关.当它崩溃时,崩溃(EXEC_BAD_ACCESS
)的调用堆栈中的顶部元素如下:
objc_msgSend
CFRelease
HTTPMessage::~HTTPMessage
_CFRelease
HTTPWriteFilter::~HTTPWriteFilter
谁能想到我可能做错了什么?我完全不知道我做错了什么,如何解决它,或者如何解决它.有没有比我正在做的更好的POST数据方式?
你的问题与你的NSData
对象有关.你是这样分配的:
NSData* requestData = [jsonData dataUsingEncoding:NSUTF8StringEncoding];
根据Cocoa的内存管理编程指南中规定的规则,您不是数据的所有者,因此您不应该release
在以后调用它. dataUsingEncoding
调用autorelease
,所以release
下次自动释放池耗尽时该对象将被删除.因为你要添加一个额外的release
,自动释放池将尝试release
一个已经被解除分配的对象,这会导致崩溃.
您发布了一个自动释放的对象.
删除行[requestData release]; 你不需要它.它导致崩溃,因为数据由您释放,然后在数据完成发送时再次释放,这是一个太多的版本.
通常,除非您分配对象,否则不会调用对象的释放,或者文档明确说明返回的对象未自动释放.(这很罕见).
使用此代码,您无需担心使用自动释放的对象,就内存而言,无论您做什么,内存都将保持不变,直到底层框架沿着线路发送数据.
我不知道是否有更好的发布数据的方法 - 你看到的代码看起来还不错,除了json数据可能在字符串和数据对象中都重复,但你发送的数据量可能很小.如果不是,您应该在创建数据后立即释放jsonData字符串.(这意味着jsonData字符串必须来自alloc/init调用以及数据).或者不要将jsonData作为字符串,只是从一开始就将它作为一个可变量的数据,但这可能很尴尬.
--Tom