在NSMutableURLRequest上使用release时出现问题

时间:2011-05-09 11:08:24

标签: iphone objective-c ios4 ipad

我对内存管理这个话题有疑问。当我创建一个 NSMutableURLRequest并在方法返回应用程序崩溃后释放它。

如果我删除NSMutableURLRequest上发布的行,则该应用程序可以正常运行。但它让内存泄漏。

出了什么问题?

这是代码:

- (NSString *) callServerWhaitReturn {

    NSMutableURLRequest * theRequest = [ NSMutableURLRequest requestWithURL: [NSURL URLWithString: self.internalUrl] cachePolicy: NSURLRequestUseProtocolCachePolicy timeoutInterval: 60.0];

    [theRequest setHTTPMethod: @"POST"];
    [theRequest setHTTPBody:[[NSString stringWithFormat:@"p1=%@", self.parameters] dataUsingEncoding: NSASCIIStringEncoding]];
    NSURLResponse * response;
    NSError * error;
    NSData * result = [NSURLConnection sendSynchronousRequest: theRequest returningResponse: &response error: &error];
    NSString * toReturn = [[[NSString alloc] initWithData: result encoding:NSASCIIStringEncoding] autorelease];
    NSLog(@"%@", toReturn );
    [theRequest release];
    if (response) {
        [response release];
    }
    if (result) {
        [result release];
    }
    [toReturn autorelease];
    return toReturn;
}

3 个答案:

答案 0 :(得分:4)

requestWithURL:cachePolicy:timeoutInterval:返回一个自动释放的对象。如果你没有保留它,你就不应该发布它。

以下是the memory management rules

答案 1 :(得分:1)

NSMutableURLRequest * theRequest = [ NSMutableURLRequest requestWithURL: [NSURL URLWithString: self.internalUrl] cachePolicy: NSURLRequestUseProtocolCachePolicy timeoutInterval: 60.0];

是一个自动释放的对象。你不能release它。您必须分配对象并获取所有权,然后才应release它。如果你想release,那么allocate像这样的对象

NSMutableURLRequest * theRequest = [[NSMutableURLRequest alloc] initWithURL: [NSURL URLWithString: self.internalUrl] cachePolicy: NSURLRequestUseProtocolCachePolicy timeoutInterval: 60.0];

答案 2 :(得分:0)

您无法释放theRequest,因为您没有分配它。

请从代码中删除以下语句。

[theRequest release];

使用initWithURL的{​​{1}}方法。