当前位置:  开发笔记 > 前端 > 正文

iPhone SDK:使用NSMutableURLRequest发布NSData会导致神秘的崩溃

如何解决《iPhoneSDK:使用NSMutableURLRequest发布NSData会导致神秘的崩溃》经验,为你挑选了2个好方法。

我看到的是一个POST请求我做结束后发生的10或20秒的崩溃(didReceiveResponse,didReceiveDataconnectionDidFinishLoading所有消防在飞机坠毁前发生了好).

这是我用来发出请求的代码:

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-TypesetValue:requestDataLengthStringContent-Length,碰撞也不会发生.我对发生的事情感到十分困惑.据我所知,崩溃直接NSData与我的请求发送对象有关.当它崩溃时,崩溃(EXEC_BAD_ACCESS)的调用堆栈中的顶部元素如下:

objc_msgSend

CFRelease

HTTPMessage::~HTTPMessage

_CFRelease

HTTPWriteFilter::~HTTPWriteFilter

谁能想到我可能做错了什么?我完全不知道我做错了什么,如何解决它,或者如何解决它.有没有比我正在做的更好的POST数据方式?



1> Adam Rosenfi..:

你的问题与你的NSData对象有关.你是这样分配的:

NSData* requestData = [jsonData dataUsingEncoding:NSUTF8StringEncoding];

根据Cocoa的内存管理编程指南中规定的规则,您不是数据的所有者,因此您不应该release在以后调用它. dataUsingEncoding调用autorelease,所以release下次自动释放池耗尽时该对象将被删除.因为你要添加一个额外的release,自动释放池将尝试release一个已经被解除分配的对象,这会导致崩溃.



2> Tom Andersen..:

您发布了一个自动释放的对象.

删除行[requestData release]; 你不需要它.它导致崩溃,因为数据由您释放,然后在数据完成发送时再次释放,这是一个太多的版本.

通常,除非您分配对象,否则不会调用对象的释放,或者文档明确说明返回的对象未自动释放.(这很罕见).

使用此代码,您无需担心使用自动释放的对象,就内存而言,无论您做什么,内存都将保持不变,直到底层框架沿着线路发送数据.

我不知道是否有更好的发布数据的方法 - 你看到的代码看起来还不错,除了json数据可能在字符串和数据对象中都重复,但你发送的数据量可能很小.如果不是,您应该在创建数据后立即释放jsonData字符串.(这意味着jsonData字符串必须来自alloc/init调用以及数据).或者不要将jsonData作为字符串,只是从一开始就将它作为一个可变量的数据,但这可能很尴尬.

--Tom

推荐阅读
勤奋的瞌睡猪_715
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有