HTTP请求内存泄漏

时间:2011-08-01 14:22:36

标签: objective-c memory-management memory-leaks nsurlconnection nsmutableurlrequest

我正在使用此代码,但在分析时,它告诉我在response_errorrequest_response变量中有很多内存泄漏。

我尝试了几个地方来放置函数中使用的每个变量的release代码,但是它也会在有错误消息和没有错误消息的情况下崩溃。 (通常是EXC_BAD_ACCESS指向内存访问错误)

我认为这可能是NSURLConnection sendSynchronousRequest方法的问题,但我不确定。

有人可以给我一个建议或在这段代码的正确位置放置release块吗?

由于

NSString *request_url = [NSString stringWithFormat:@"http://www.server.com/api/arg1/%@/arg2/%@/arg3/%@",self._api_key,self._device_id,self._token];
NSURL *requestURL = [NSURL URLWithString:request_url];
NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease];
[request setURL:requestURL];
NSError *response_error = [[NSError alloc] init];
NSHTTPURLResponse *_response = [[NSHTTPURLResponse alloc] init];
NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:&_response error:&response_error];
NSString *str_response = [[NSString alloc] initWithData:response encoding:NSUTF8StringEncoding];
return [[str_response JSONValue] valueForKey:@"pairing"];

其中变量定义为

@interface MyClass : NSObject {
  NSString *_device_id;
  NSString *_token;
  NSString *_api_key;
}
@property (nonatomic,retain) NSString *_device_id;
@property (nonatomic,retain) NSString *_api_key;
@property (nonatomic,retain) NSString *_token;

2 个答案:

答案 0 :(得分:3)

您通过不必要地分配它们而泄露_responeresponse_error。您正在将指针传递给指向一个方法的指针,该方法只会更改指针创建泄漏。您还需要自动发布str_response

NSError *response_error = nil; //Do not alloc/init
NSHTTPURLResponse *_response = nil; //Do not alloc/init
NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:&_response error:&response_error];
NSString *str_response = [[[NSString alloc] initWithData:response encoding:NSUTF8StringEncoding] autorelease];
return [[str_response JSONValue] valueForKey:@"pairing"];

答案 1 :(得分:0)

如果你正在调用alloc / init然后不调用release或autorelease,那么你可能会泄漏内存。